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 - 如何根据分隔符拆分每个元素的主要内容,如果未能解决你的问题,请参考以下文章