XSLT - 如何根据分隔符拆分每个元素

Posted

技术标签:

【中文标题】XSLT - 如何根据分隔符拆分每个元素【英文标题】:XSLT - How to split each element based on a delimiter 【发布时间】:2017-06-24 02:58:27 【问题描述】:

我在 xml 中的输入将如下所示

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

有人可以告诉我如何使用 xslt 基于特定分隔符 ')' 拆分 about 输入行,以便输出如下所示。 右括号后的分隔符应该是';'

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

谢谢

【问题讨论】:

【参考方案1】:

因为看起来您并没有真正拆分任何内容,所以另一个 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>

【讨论】:

以上是关于XSLT - 如何根据分隔符拆分每个元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 程序对具有逗号分隔值的 XML 元素进行分组

根据分隔符将一个文件拆分为多个文件

如何根据三个分隔符拆分字符串?

如何根据两个分隔符拆分字符串?

根据变长分隔符拆分熊猫字符串列

如何使用 Python 使用管道分隔符拆分文本文件,然后根据条件选择列?