要转换的 XSLT XML:选择 uuid 并按顺序排序

XSLT to transform XML: selecting uuids and sorting in order

   ## 

我有一个很大的 xml 文件,其中有多个 uuid 分组在不同的元素下。我希望它们在每个组中进行排序。有人可以请 post 他们对此有想法吗。------------

这是用来格式化的 xslt 文件

预期输出:对文件中的所有 uid 进行排序

如果要对 uuid 元素进行排序,则必须从其父 uuids 元素的上下文中对它们应用排序指令 - 而不是不存在的 test 元素来自不存在的 table 元素的上下文。

此外,UUID 不是数字,将它们作为数字排序是没有意义的。事实上,根本不清楚对它们进行排序有什么意义,因为根据定义,它们是无意义的。不过,如果你愿意,你可以这样做:

<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="uuids">
    <xsl:copy>
        <xsl:apply-templates select="uuid">
            <xsl:sort select="."/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

演示https://xsltfiddle.liberty-development.net/6qaHaQP

您可以通过以下方式实现:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <!-- If the uuid elements are not always in a uuids element, can replace with *[uuid] -->
    <xsl:template match="uuids">
        <xsl:copy>
            <xsl:for-each select="uuid">
                <xsl:sort select="." data-type="text" order="ascending"/>
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
  
</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/93wniTR

这是工作正常的 .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="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="uuids">
    <xsl:copy>
        <xsl:apply-templates select="uuid">
            <xsl:sort select="."/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="history">
    <xsl:copy>
        <xsl:apply-templates select="historyInfo">
            <xsl:sort select="@versionUuid"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>