我有一个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-component
和tracking-component
中的配置属性也按字母顺序排序。
请帮忙。
答案 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>
注意强>:
XML区分大小写:Configuration
不等于configuration
;
处理命名空间中元素的正确方法是使用如图所示的前缀 - 而不是仅使用本地名称忽略命名空间;
结果与您问题中显示的结果不同 - 但我相信它是正确的。