正在对 groovy 中的 xml 个节点进行排序

Sorting xml nodes in groovy

我有一个 XML,我需要向其添加新节点,这是我使用 appendNode 实现的。但是,新添加的节点放在XML的末尾。我现在想对 XML 进行排序,使其到达正确的位置:

<Order>
<Customer>
...
</Customer>
<item>
    <itemID>1</itemID>
</item>
<item>
    <parentItemID>1</parentItemID>
    <priority>25</priority>
</item>
<item>
     <itemID>2</itemID>
</item>
<deliverydetails>
</deliverydetails>
<invoiceTerms>
....
</invoiceTerms>

//this is my newly added item
<item>
    <parentItemID>2</parentItemID>
    <priority>35</priority>
</item>
</Order>

我需要重新排序,使其显示在顶部,如:

<Order>
<Customer>
...
</Customer>
<item>
    <itemID>1</itemID>
</item>
<item>
    <parentItemID>1</parentItemID>
    <priority>25</priority>
</item>
<item>
     <itemID>2</itemID>
</item>
<item>
    <parentItemID>2</parentItemID>
    <priority>35</priority>
</item>
<deliverydetails>
</deliverydetails>
<invoiceTerms>
....
</invoiceTerms>
</Order>

尝试了以下代码:

Node root = new XmlParser().parse(xml);
def orderNode = root.Order;
....
orderNode[0].children().sort(true) {it.item.parentItemID.text()}

I only need to put that last item node that I newly added so that it appears together with the other item nodes, rather than at the end (preferably together with the item ID specified under parentItemID so that items and their related sub-items are together)

如果您确定 itemID 为 2 的项目(您新添加的项目的 parentItemID)将出现在输入 XML 中,您可以简单地执行以下操作:

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="item[itemID=2]">
    <xsl:copy-of select="."/>
    <item>
        <parentItemID>2</parentItemID>
        <priority>35</priority>
    </item>
</xsl:template>
        
</xsl:stylesheet>

-- 添加--

如果您只想重新排序节点以便所有 item 元素保持在一起(在添加新项目之后),那么您可以这样做:

<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="/Order">
    <xsl:copy>
        <xsl:copy-of select="Customer"/>
        <xsl:copy-of select="item"/>
        <xsl:copy-of select="deliverydetails"/>
        <xsl:copy-of select="invoiceTerms"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

如果您想确保新添加的项目在其父项目之后(或者更准确地说,每个子项目都在其父项目之后),请尝试:

<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:key name="sub-item" match="item" use="parentItemID" />

<xsl:template match="/Order">
    <xsl:copy>
        <xsl:copy-of select="Customer"/>
        <xsl:for-each select="item[not(parentItemID)]">
            <xsl:copy-of select="."/>
            <xsl:copy-of select="key('sub-item', itemID)"/>
        </xsl:for-each>
        <xsl:copy-of select="deliverydetails"/>
        <xsl:copy-of select="invoiceTerms"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>