我的XML中有一个节点用于名字,其中包含中间的初始IF,中间的初始存在。 (提供XML的数据库没有Middle Initial字段)。
实施例:
<billing-firstname>Nicholas M.</billing-firstname>
<billing-firstname>Timothy</billing-firstname>
我希望能够将其显示为缩写。
输出示例:
N. M.
T.
我已经知道如何阻止节点的第一个字符,而不是如何将其拆分为具有First Initial然后中间初始的IF它存在。
<xsl:value-of select="substring(billing-firstname,1,1)" />
非常感谢任何帮助。
-Nick
答案 0 :(得分:1)
由于您正在使用XSLT 2.0(使用XPath 2.0),因此您可以结合使用for
,tokenize
,substring
,concat
和{ {1}} ...
string-join
示例:
XML输入
string-join(for $name in tokenize(normalize-space(),'\s') return concat(substring($name,1,1),'.'),' ')
XSLT 2.0
<doc>
<billing-firstname>Nicholas M.</billing-firstname>
<billing-firstname>Timothy</billing-firstname>
</doc>
XML输出
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="billing-firstname">
<xsl:copy>
<xsl:value-of select="string-join(for $name in tokenize(normalize-space(),'\s') return concat(substring($name,1,1),'.'),' ')"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
此XSLT 2.0转换:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="billing-firstname">
<xsl:for-each select="tokenize(., ' ')">
<xsl:value-of select="concat(substring(.,1,1), '. ')"/>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML (包装在单个顶部元素中以使其格式良好的XML文档):
<t>
<billing-firstname>Nicholas M.</billing-firstname>
<billing-firstname>Timothy</billing-firstname>
</t>
会产生想要的正确结果:
N. M.
T.