如何在 XSLT 中拆分数据并存储在多个节点中
Posted
技术标签:
【中文标题】如何在 XSLT 中拆分数据并存储在多个节点中【英文标题】:How can I split data and store in Multiple Nodes in XSLT 【发布时间】:2021-12-13 02:47:18 【问题描述】:我有以下 xml 数据:
<?xml?>
<data>
<first>1,2,3,4</first>
<second>A,B,C,D</second>
</data>
如何使用 XSLT 将其转换为类似的东西
<result>
<first>1</first>
<second>A</second>
</result>
<result>
<first>2</first>
<second>B</second>
</result>
<result>
<first>3</first>
<second>C</second>
</result>
<result>
<first>4</first>
<second>D</second>
</result>
有什么解决办法吗?请帮忙。
【问题讨论】:
请说明您将使用哪个 XSLT 处理器。 【参考方案1】:XSLT-2.0 解决方案可以是
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data">
<xsl:variable name="first" select="tokenize(first,',')" />
<xsl:variable name="second" select="tokenize(second,',')" />
<data>
<xsl:for-each select="$first">
<xsl:variable name="cur" select="position()" />
<first><xsl:value-of select="." /></first>
<second><xsl:value-of select="$second[$cur]" /></second>
</xsl:for-each>
</data>
</xsl:template>
</xsl:stylesheet>
它的输出是
<?xml version="1.0" encoding="UTF-8"?>
<data>
<first>1</first>
<second>A</second>
<first>2</first>
<second>B</second>
<first>3</first>
<second>C</second>
<first>4</first>
<second>D</second>
</data>
XSLT-1.0 解决方案会更复杂 - 需要递归模板来剖析逗号分隔的字符串。
【讨论】:
【参考方案2】:这是一个 XSLT 3.0 解决方案:
<xsl:function name="f:process-pair">
<xsl:param name="x"/>
<xsl:param name="y"/>
<result>
<first>$x</first>
<second>$y</second>
</result>
</xsl:function>
<xsl:template match="data">
<xsl:sequence select="for-each-pair(
tokenize(first, ','),
tokenize(second, ','),
f:process-pair#2)"/>
</xsl:template>
【讨论】:
以上是关于如何在 XSLT 中拆分数据并存储在多个节点中的主要内容,如果未能解决你的问题,请参考以下文章