【发布时间】:2014-05-16 15:45:49
【问题描述】:
我必须使用以下格式的大型 xml。
<First>
<Second Argument="12" Argument2="34" >
<Order InvOrg="123" Identifier="3580456" >
<SupplyDetails Type="TRACK" Quantity="7" Demand="ONHAND" />
</Order>
<Order InvOrg="Test" Identifier="3580457" >
<SupplyDetails Type="TRACK" Quantity="15" Demand="ONHAND" />
</Order>
<Order InvOrg="123" Identifier="3580458" >
<SupplyDetails Type="TRACK" Quantity="17" Demand="ONHAND" />
</Order>
<Order InvOrg="123" Identifier="3580459" >
<SupplyDetails Type="TRACK" Quantity="10" Demand="ONHAND" />
</Order>
<Order InvOrg="123" Identifier="2888144" >
<SupplyDetails Type="TRACK" Quantity="3" Demand="ONHAND" />
</Order>
<Order InvOrg="123" Identifier="2888147" >
<SupplyDetails Type="TRACK" Quantity="9" Demand="ONHAND" />
<Order>
<Order InvOrg="123" Identifier="2749622" >
<SupplyDetails Type="TRACK" Quantity="142" Demand="ONHAND" />
</Order>
</Second>
</First>
我需要把它转换成下面的格式
<First>
<Second Argument="12" Argument2="34" >
<Order InvOrg="123" Identifier="3580456" >
<SupplyDetails Type="TRACK" Quantity="7" Demand="ONHAND" />
</Order>
<Order InvOrg="Test" Identifier="3580457" >
<SupplyDetails Type="TRACK" Quantity="15" Demand="ONHAND" />
</Order>
<Order InvOrg="123" Identifier="3580458" >
<SupplyDetails Type="TRACK" Quantity="17" Demand="ONHAND" />
</Order>
</Second>
</First>
<First>
<Second Argument="12" Argument2="34" >
<Order InvOrg="123" Identifier="3580459" >
<SupplyDetails Type="TRACK" Quantity="10" Demand="ONHAND" />
</Order>
<Order InvOrg="123" Identifier="2888144" >
<SupplyDetails Type="TRACK" Quantity="3" Demand="ONHAND" />
</Order>
<Order InvOrg="123" Identifier="2888147" >
<SupplyDetails Type="TRACK" Quantity="9" Demand="ONHAND" />
<Order>
<Order InvOrg="123" Identifier="2749622" >
<SupplyDetails Type="TRACK" Quantity="142" Demand="ONHAND" />
</Order>
</Second>
</First>
在xslt 2.0中,可以用下面的代码实现..
<xsl:stylesheet
version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/First">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Second">
<xsl:for-each-group select="Order" group-starting-with="Order[(position() -1)mod 3 = 0]">
<First>
<Second>
<xsl:copy-of select="current-group()"/>
</Second>
</First>
</xsl:for-each-group>
</xsl:template>
我的项目只使用了xslt 1.0,所以我需要把上面的逻辑改成1.0。我如何在 xslt 1.0 中实现相同的逻辑
【问题讨论】:
-
您的 XSLT 2.0 代码似乎将块组织为三个一组,这将产生 3 个块(最后一个块仅包含一个元素),但您想要的上面的结果有 2 个块(第二个带有4 个元素)。您期待这两种结果中的哪一种?
-
另请注意,您请求的输出没有根元素。
-
@helderdarocha - 我给出的结果样本并不完美,但 xsl 是。
-
@michael.hor257k- 正确,错过了提供根节点,但 Marcus Rickert 解决方案也满足了这一要求。