删除姓氏,但使用 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()) < 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 1.0 进行多项更改(大写元素首字母、顺序元素、聚合/组元素)