gpt4 book ai didi

xml - XSLT 根据子元素属性对父元素进行排序

转载 作者:行者123 更新时间:2023-12-02 21:10:07 27 4
gpt4 key购买 nike

虽然这个问题已经像 multiples timeshere 一样被问过,并且答案似乎都适用于该特定问题,但我无法让它在我的情况下工作。

这个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>

需要转换成这个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>

我想要做的是,对于每个 <Order>,根据子 <OrderLine> 的属性值对 <Item>/@code 元素进行排序,并删除该子代的一些属性。 OrderLine 之外的所有其他元素都需要保持不变。请不要介意 xml 的非优化结构,这是无法更改的。对于每个与排序相结合的情况,它可能需要复制,就像这样,但更好:

<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>

最佳答案

What I'm trying to do is for each <Order> sort the <OrderLine> elements based on the attributevalue of child <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>

注意:由于空字符串首先排序,您可以将模板缩短为:

<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>

.. and also strip some attributes of that child.

我在你的样式表中没有看到这一点。无论如何,只需添加另一个模板来匹配 Item 即可。 .

关于xml - XSLT 根据子元素属性对父元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33973682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com