删除姓氏,但使用 XSLT 保持首字母

Posted

技术标签:

【中文标题】删除姓氏,但使用 XSLT 保持首字母【英文标题】:Remove last name but keep initial with XSLT 【发布时间】:2020-11-17 05:55:03 【问题描述】:

我几天前创建了一个帖子 - 你可以在这里找到 Remove last name but keep initial。我得到了 php 所需的答案,但现在我需要弄清楚如何使用 xslt 模板做同样的事情。

由于 hipaa 法律,我无法在评论中显示姓氏,因此我尝试保留名字,仅显示姓氏的首字母。

如果需要,这是我的 xml 结构(data.xml):

<item>
<title>Carole Baskin left a 5 Star Review on Google</title>
<description>Maecenas ullamcorper id eros nec dictum. Proin mattis ullamcorper nisl, id gravida tortor eleifend at. Fusce condimentum mauris non iaculis eleifend.</description>
</item>

下面是我的 xsl 模板代码 (xsl.xml)。 select="title" 将显示名字和姓氏。例如:Carole Baskin 在 Google 上留下了 5 星评价。我需要它说“Carole B 在 Google 上留下了 5 星评价”

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:php="http://php.net/xsl"
    exclude-result-prefixes="php"
    version="1.0">
<xsl:output method="html" encoding="utf-8" indent="no"/>

<xsl:template match="/rss/channel">
    <xsl:for-each select="item[description[normalize-space() and php:function('str_word_count', string()) &lt; 50]]">
    
    <li>
        <p style="background: rgba(0, 0, 0, 0.5); border-radius: 25px; padding:22px;" class="heading">
            <xsl:value-of select="title"/>
        </p>

        <p class="text">
            <xsl:value-of select="description"/>
        </p>
    </li>
    
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

我用来加载 xsl 的 PHP 代码:

<?php
   $xmlFile = "data.xml;
   $xslFile = "xsl.xml";
                        
   $doc = new DOMDocument();
   $xsl = new XSLTProcessor();
                    
   $doc->load($xslFile);
   $xsl = new XSLTProcessor();
   $xsl->registerPHPFunctions();
    
   $xsl->importStyleSheet($doc);
                    
   $doc->load($xmlFile);
   echo $xsl->transformToXML($doc);
?>

【问题讨论】:

对于 XSLT 问题,您需要说明您使用的是哪个版本的 XSLT,因为这通常会影响答案。对于涉及字符串操作的问题尤其如此,在 XSLT 2.0+ 中可以使用正则表达式来完成。 【参考方案1】:

如果(正如您在对其他问题的评论中所说)姓氏始终是title 的第一个和第二个空格之间的字符串,您可以替换:

<xsl:value-of select="title"/>

与:

<xsl:value-of select="substring-before(title, ' ')"/>
<xsl:variable name="tail" select="substring-after(title, ' ')"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring($tail, 1, 1)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring-after($tail, ' ')"/>

或者,如果您愿意:

<xsl:variable name="head" select="substring-before(title, ' ')"/>
<xsl:value-of select="substring(title, 1, string-length($head) + 2)"/>
<xsl:text> </xsl:text>
<xsl:value-of select="substring-after(substring-after(title, ' '), ' ')"/>

【讨论】:

非常感谢!正是我想要做的:)

以上是关于删除姓氏,但使用 XSLT 保持首字母的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 对首字母缩略词列表进行 Slugify

使用 XSLT 1.0 进行多项更改(大写元素首字母、顺序元素、聚合/组元素)

如何将个人资料图像设置为名字和姓氏的首字母?

通讯录的abc首字母怎么调

Google Apps 脚本:自定义函数,仅根据条件连接多行中的首字母

NSString 中的大写首字母