XSLT - 如何基于分隔符拆分每个元素

时间:2017-02-07 01:23:57

标签: xml xslt

我的输入在xml

中如下
abc(123)def(456)ghi(789)jkl(098)mno(765)

有人可以让我知道如何使用基于特定分隔符')'的xslt拆分about输入行,以便输出如下所示。 闭括号分隔符后应为';'

abc(123);def(456);ghi(789);jkl(098);mno(765)

由于

1 个答案:

答案 0 :(得分:0)

因为它实际上看起来不像是分裂任何东西,所以另一个XSLT 2.0选项只是replace() ......

XML输入

<test>abc(123)def(456)ghi(789)jkl(098)mno(765)</test>

XSLT 2.0

<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="test">
    <xsl:copy>
      <xsl:value-of select="replace(.,'\)',');')"/>
      <!-- 
        Instead of replace(), you could also use tokenize()/string-join():
         <xsl:value-of select="string-join(tokenize(.,'\)'),');')"/>
        or even tokenize() with the separator attribute:
         <xsl:value-of select="tokenize(.,'\)')" separator=");"/>
      -->
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<test>abc(123);def(456);ghi(789);jkl(098);mno(765);</test>

如果您需要使用XSLT 1.0并且不希望/不能使用扩展函数,则可以使用递归模板调用:

XSLT 1.0 (与上面相同的输入/输出。)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="test">
    <xsl:copy>
      <xsl:call-template name="addSeparator">
        <xsl:with-param name="input" select="."/>
      </xsl:call-template>      
    </xsl:copy>
  </xsl:template>

  <xsl:template name="addSeparator">
    <xsl:param name="sep" select="';'"/>
    <xsl:param name="input"/>
    <xsl:variable name="remaining" select="substring-after($input,')')"/>
    <xsl:value-of select="concat(substring-before($input,')'),')',$sep)"/>
    <xsl:if test="$remaining">
      <xsl:call-template name="addSeparator">
        <xsl:with-param name="input" select="$remaining"/>
        <xsl:with-param name="sep" select="$sep"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>