基于属性值按字母顺序对子元素进行排序

时间:2014-05-07 17:02:51

标签: xml sorting xslt

我想根据特定属性的值对XML文档的子元素进行排序。

这是test.xml文档:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="sort.xsl"?>
<resources>
    <string name="zero">test</string>
    <string name="alfa">test</string>
    <string name="foxtrot">test</string>
    <string name="golf">test</string>
</resources>

这是sort.xsl:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="resources">
        <assembly>
            <xsl:apply-templates select="string">
                <xsl:sort select="@name" order="ascending" data-type="text" />
            </xsl:apply-templates>
        </assembly>
    </xsl:template>
</xsl:stylesheet>

据我所知,这应匹配string元素下的所有resources元素,并尝试按字母顺序对它们进行排序,这将产生以下输出:

<resources>
    <string name="alfa">test</string>
    <string name="foxtrot">test</string>
    <string name="golf">test</string>
    <string name="zero">test</string>
</resources>

它不起作用。这是我写过的第一个XSL转换。我正在使用XML Notepad 2007,并且在我的XSL输出屏幕中没有显示任何内容。没有解析错误,只是一个空白屏幕。我这样做完全错了吗?我试图找到here找到的代码。

2 个答案:

答案 0 :(得分:2)

您正在按排序顺序处理字符串元素,但您没有匹配它们的模板,因此请添加

<xsl:template match="string">
  <xsl:copy-of select="."/>
</xsl:template>

或者如果您还需要处理其他节点,则复制节点的通用模板。

答案 1 :(得分:2)

  

我的XSL输出屏幕中没有显示任何内容。没有解析错误,只是   一个空白的屏幕。

如果输出中没有显示任何内容,则问题不在于排序。应用于输入时,样式表应产生以下结果:

<?xml version="1.0"?>
<assembly>testtesttesttest</assembly>

这可能不是您期望的结果 - 但它不是空白,因此在抛光样式表之前,请查看启动转换的方式中的错误。

-
顺便说一句,虽然很难看到,结果中的那4个测试字符串按父字符串的name属性排序。