根据子节点拆分 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
元素。
不确定为什么将此转换称为“拆分”。
我想基于子节点使用 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
元素。
不确定为什么将此转换称为“拆分”。