根据子节点拆分 xml 文档

Splitting xml document based on a child node

我想基于子节点使用 XSLT(支持 2.0/3.0 版)拆分 xml 文档。在下面提供的示例中,它应该基于 Item 节点。

基本上,当我们拆分时,Item 节点将携带它上面的所有祖先元素,但不会携带根元素。

<Root>
    <List>
        <Header>
            <test1>a</test1>
        </Header>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>1</Number>
                </ItemNumber>
            </Item>
        </Order>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>2</Number>
                </ItemNumber>
            </Item>
        </Order>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>3</Number>
                </ItemNumber>
            </Item>
        </Order>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>4</Number>
                </ItemNumber>
            </Item>
        </Order>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>5</Number>
                </ItemNumber>
            </Item>
        </Order>
    </List>
</Root>

所需输出为 -

<Root>
    <List>
        <Header>
            <test1>a</test1>
        </Header>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>1</Number>
                </ItemNumber>
            </Item>
        </Order>
    </List>
    <List>
        <Header>
            <test1>a</test1>
        </Header>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>2</Number>
                </ItemNumber>
            </Item>
        </Order>
    </List>
    <List>
        <Header>
            <test1>a</test1>
        </Header>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>3</Number>
                </ItemNumber>
            </Item>
        </Order>
    </List>
    <List>
        <Header>
            <test1>a</test1>
        </Header>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>4</Number>
                </ItemNumber>
            </Item>
        </Order>
    </List>
    <List>
        <Header>
            <test1>a</test1>
        </Header>
        <Order>
            <Item>
                <ItemNumber>
                    <Number>5</Number>
                </ItemNumber>
            </Item>
        </Order>
    </List>
</Root>


我试过的 XSLT 如下所述,我在输出中得到相同数量的项目(所有项目都在重复,而不是想要的项目)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/Root">
        <xsl:copy>
            <xsl:for-each select="List/Order/Item">
                <xsl:copy-of select=" ancestor-or-self::List | Order"/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

你基本上想要

<xsl:template match="Order">
  <List>
    <xsl:copy-of select="../Header">
    <xsl:copy-of select=".">
  </List>
</xsl:template>

加上 top-level 规则构造 Root 元素。

不确定为什么将此转换称为“拆分”。