如何在 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 中拆分数据并存储在多个节点中的主要内容,如果未能解决你的问题,请参考以下文章

使用 xslt 将 xml 复杂节点元素拆分为多个节点

在 XSLT 中,如何使用存在多个相同节点的 ID 从节点中选择一个值?

如何从 XSLT 中的地址字段中拆分街道和门牌号?

XSLT:如何将一个元素解析为多个变量

使用父元素在 XSLT 中拆分/分组

Hive 查询以拆分列数据并存储到多个记录中