尽管这个问题已经被问过多次,比如这里和这里,而且答案似乎都适用于该特定问题,但我无法让它在我的情况下发挥作用。
这个xml
<root>
<Orders>
<Order type="S">
<Ref>ABC123</Ref>
<OrderedBy>
<Debtor code="13456"></Debtor>
</OrderedBy>
<DeliveryMethod code="Truck"></DeliveryMethod>
<OrderLine line="1">
<Item code="ABC100400"></Item>
<Quantity>1</Quantity>
</OrderLine>
<OrderLine line="2">
<Item code="XYZ490204" type="S" searchcode="XYZ490204"></Item>
<Quantity>2</Quantity>
</OrderLine>
<OrderLine line="3">
<Item code="DEF1210847" type="S" searchcode="DEF1210847"></Item>
<Quantity>4</Quantity>
</OrderLine>
</Order>
<Order type="S">
<Ref>ABC123</Ref>
<OrderedBy>
<Debtor code="BLABLA" number="802416" type="C"></Debtor>
</OrderedBy>
<DeliveryMethod code="Barefoot"></DeliveryMethod>
<OrderLine line="1">
<Item code="QQQ123456" type="S" searchcode="QQQ123456"></Item>
<Quantity>1</Quantity>
</OrderLine>
<OrderLine line="2">
<Item code="JJJ490204" type="S" searchcode="JJJ490204"></Item>
<Quantity>3</Quantity>
</OrderLine>
</Order>
</Orders>
</root>
Run Code Online (Sandbox Code Playgroud)
需要转换成这个xml:
<root>
<Orders>
<Order type="S">
<Ref>ABC123</Ref>
<OrderedBy>
<Debtor code="13456"></Debtor>
</OrderedBy>
<DeliveryMethod code="Truck"></DeliveryMethod>
<OrderLine line="1">
<Item code="ABC100400"></Item>
<Quantity>1</Quantity>
</OrderLine>
<OrderLine line="3">
<Item code="DEF1210847"></Item>
<Quantity>4</Quantity>
</OrderLine>
<OrderLine line="2">
<Item code="XYZ490204"></Item>
<Quantity>2</Quantity>
</OrderLine>
</Order>
<Order type="S">
<Ref>ABC123</Ref>
<OrderedBy>
<Debtor code="BLABLA"></Debtor>
</OrderedBy>
<DeliveryMethod code="Barefoot"></DeliveryMethod>
<OrderLine line="2">
<Item code="JJJ490204"></Item>
<Quantity>3</Quantity>
</OrderLine>
<OrderLine line="1">
<Item code="QQQ123456"></Item>
<Quantity>1</Quantity>
</OrderLine>
</Order>
</Orders>
</root>
Run Code Online (Sandbox Code Playgroud)
我想做的是根据子元素的属性值对每个元素进行<Order>排序,并删除该子元素的一些属性。除此以外的所有其他元素都需要保持不变。请不要介意 xml 的非优化结构,这是无法更改的。对于每个与排序相结合的情况,它可能需要复制,如下所示,但更好:<OrderLine><Item>/@codeOrderLine
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Orders">
<xsl:copy>
<xsl:apply-templates select="Order/OrderLine/Item|@*">
<xsl:sort select="@code" data-type="text"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
我想做的是根据 子元素的属性值对元素
<Order>进行排序......<OrderLine><Item>/@code
如果要对OrderLine元素进行排序,则必须从其父元素的上下文中执行此操作Order:
XSLT 1.0
<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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Order">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*[not(self::OrderLine)]"/>
<xsl:apply-templates select="OrderLine">
<xsl:sort select="Item/@code" data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
注意:由于空字符串首先排序,因此您可以将模板缩短为:
<xsl:template match="Order">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="Item/@code" data-type="text" order="ascending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
..并且还剥夺了该孩子的一些属性。
我在你的样式表中没有看到这一点。无论如何,只需添加另一个模板来匹配即可Item。
| 归档时间: |
|
| 查看次数: |
2160 次 |
| 最近记录: |