XSL在空格后显示节点的第一个字母(如果存在空格)

时间:2015-10-14 17:28:26

标签: xml xslt xslt-2.0

我的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

2 个答案:

答案 0 :(得分:1)

由于您正在使用XSLT 2.0(使用XPath 2.0),因此您可以结合使用fortokenizesubstringconcat和{ {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>&#xA;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

应用于提供的XML (包装在单个顶部元素中以使其格式良好的XML文档):

<t>
    <billing-firstname>Nicholas M.</billing-firstname>
    <billing-firstname>Timothy</billing-firstname>
</t>

会产生想要的正确结果:

N. M. 
T.