首页 > 解决方案 > 需要执行嵌套数字排序 (xslt 1.0)

问题描述

下面的 XML 需要使用 XSLT 1.0 对每个 WorkingTemplate 的 queueId 进行排序

在这里问的原因:到目前为止看到的所有示例都没有这种结构。因此,我无法为此附加任何有效的 xslt。请帮忙。

<Export>
    <WorkingTemplates>
        <WorkingTemplate label="MM_DR">
            <WorkingQueues>
                <WorkingQueue queueId="132" right="READ_WRITE"/>
                <WorkingQueue queueId="49" right="READ_WRITE"/>
                <WorkingQueue queueId="197" right="NO_ACCESS"/>
            </WorkingQueues>
        </WorkingTemplate>
        <WorkingTemplate label="FX_MA">
            <WorkingQueues>
                <WorkingQueue queueId="123" right="READ_WRITE"/>
                <WorkingQueue queueId="60" right="READ_WRITE"/>
                <WorkingQueue queueId="182" right="NO_ACCESS"/>
            </WorkingQueues>
        </WorkingTemplate>
    </WorkingTemplates>
</Export> ```


[![Situation before sort][1]][1]


[![Situation after sort][2]][2]


  [1]: https://i.stack.imgur.com/5ojwu.png
  [2]: https://i.stack.imgur.com/fmyKf.png

标签: xmlxslt

解决方案


你可以试试这个用法for-each

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">
    <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="WorkingQueues">
        <xsl:copy>
            <xsl:for-each select="WorkingQueue">
                <xsl:sort select="@queueId" order="ascending" data-type="number"/>
                <xsl:copy>
                    <xsl:copy-of select="@*"/>
                </xsl:copy>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

推荐阅读