使用XSL样式表按名​​称属性排序

时间:2016-11-09 22:39:31

标签: xslt transformation

我有一个XML文件,它有许多相同类型的嵌套元素。我希望能够通过name属性值对它们进行排序。以下是文件

的示例
 <configurations>
    <configuration xmlns="http://locomotive/bypass/docx" name="managed">
        <configuration name="tracking-component">
            <configuration name="disks"/>
            <configuration name="cycles"/>
        </configuration>
        <configuration name="network-component" class="singular">
            <configuration name="data-component"/>
            <configuration name="node"/>
            <configuration name="modal"/>
        </configuration>
    </configuration>
</configurations>

目标是让上述文件按如下方式排序:

<configurations>
    <configuration xmlns="http://locomotive/bypass/docx" name="managed">
        <configuration name="tracking-component" class="singular">
            <configuration name="data-component"/>
            <configuration name="modal"/>
            <configuration name="node"/>
        </configuration>
        <configuration name="network-component">
            <configuration name="disks"/>
            <configuration name="cycles"/>
        </configuration>
    </configuration>
</configurations>

我尝试了这个样式表,但它没有输出任何内容:

<xsl:stylesheet version="1.0">    
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

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

    <xsl:template match="//*[local-name() = 'Configuration']">
        <xsl:copy>
            <xsl:apply-templates select="Configuration/@name">
                <xsl:sort select="."/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

以下是我想要制作的内容:

<configurations>
    <configuration xmlns="http://locomotive/bypass/docx" name="managed">
        <configuration name="network" class="singular">
            <configuration name="data-component"/>      
            <configuration name="modal"/>
            <configuration name="node"/>
        </configuration>
        <configuration name="tracking-component">
            <configuration name="cycles"/>
            <configuration name="disks"/>
        </configuration>
    </configuration>
</configurations>

network-component属性现在以正确的字母顺序显示在tracking-component属性之前。 network-componenttracking-component中的配置属性也按字母顺序排序。

请帮忙。

1 个答案:

答案 0 :(得分:0)

以这种方式尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://locomotive/bypass/docx" >
<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="ns1:configuration">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates select="ns1:configuration">
            <xsl:sort select="@name"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

注意

  1. XML区分大小写:Configuration不等于configuration;

  2. 处理命名空间中元素的正确方法是使用如图所示的前缀 - 而不是仅使用本地名称忽略命名空间;

  3. 结果与您问题中显示的结果不同 - 但我相信它是正确的。