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

Posted

技术标签:

【中文标题】使用 xslt 将 xml 复杂节点元素拆分为多个节点【英文标题】:Split xml complex node elements into multiple nodes using xslt 【发布时间】:2012-09-17 10:56:19 【问题描述】:

有没有办法使用 xslt 将一个父节点拆分成多个节点?

我想将源 xml 转换为目标。

源xml

    <?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0">
        <channel>
            <item>
                <id>Some id</id>
                <node1>
                    <node2 size="10.5" code="abcd"></node2>
                    <node2 size="10" code="cdef"></node2>        
                </node1>
            </item>
        </channel>
    </rss>

目标 xml

    <?xml version="1.0" encoding="utf-8"?>
    <rss version="2.0">
        <channel>
            <item>
                <id>Some id_10.5</id>
                <size>10.5</size>
                <code>abcd</code>
            </item>
            <item>
                <id>Some id_10</id>
                <size>10</size>
                <code>cdef</code>
            </item>
        </channel>
    </rss>

如果您注意到目标 xml 中节点 id 的值,它会附加一个下划线和大小。

【问题讨论】:

谁能帮我完成下面迈克尔给出的解决方案。 【参考方案1】:

非常直截了当,不清楚您为什么会觉得这很困难。

<xsl:template match="node2">
            <item>
                <id><xsl:value-of select="../../id"/>_<xsl:value-of select="@size"/></id>
                <size><xsl:value-of select="@size"/></size>
                <code><xsl:value-of select="@code"/></code>
            </item> 
</xsl:template> 

为其他元素加上一些琐碎的模板规则。

【讨论】:

谢谢@Michael 但它有一些问题。我将以下行放在模板 w3.org/1999/XSL/Transform"> 之前和模板之后的这一行 但是目标 xml 的第一个节点 ID 值出现在第一个项目节点之前。对不起,我是菜鸟。 嗯,我认为 *** 是一个为特定问题获得特定解决方案的好地方,但不适合说“请教我基本的 XSLT”。有这方面的书——我写过一本——我建议你读一读。

以上是关于使用 xslt 将 xml 复杂节点元素拆分为多个节点的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 或 XSLT 将复杂的 XML 转换为 CSV

如何在 XSLT 中拆分数据并存储在多个节点中

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

有没有办法使用 XSLT 基于 XML 中的元素复制 XML 节点 n 次?

使用 XSLT 将 XML 元素移动到不同的节点

XSLT - 根据长度很好地将长地址拆分为多个标签