XSLT 1.0 对元素进行排序

5

我有以下的XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<objects>
    <object>Clutch</object>
    <object>Gearbox</object>
    <object>Cylinder head</object>
    <object>Starter</object>
    <object>Airbox</object>
    <object>Inlet manifold</object>
</objects>

以下是XSLT文档:

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

    <xsl:template match="objects">
        <parts>
            <xsl:apply-templates>
                <xsl:sort select="object"/>
            </xsl:apply-templates>
        </parts>
    </xsl:template>

    <xsl:template match="object">
        <part>
            <xsl:apply-templates/>
        </part>
    </xsl:template>

</xsl:stylesheet>

应用后,我得到了预期的输出,但是它没有被排序:

<?xml version="1.0" encoding="UTF-8"?>
<parts>
    <part>Clutch</part>
    <part>Gearbox</part>
    <part>Cylinder head</part>
    <part>Starter</part>
    <part>Airbox</part>
    <part>Inlet manifold</part>
</parts>

为什么<xsl:sort select="object"/>没有生效?
1个回答

8
原因在于:
      <parts>
          <xsl:apply-templates>
              <xsl:sort select="object"/>
          </xsl:apply-templates>
      </parts>

这将模板应用到当前节点 (objects) 的子节点 (object) 并按其第一个 object 子节点的字符串值进行排序。

但是在提供的 XML 文档中,object 没有任何 object 子节点 -- 因此它们都具有相同的排序键 -- 空字符串 -- 并且它们的原始顺序不会被排序操作改变。

解决方案:

        <parts>
            <xsl:apply-templates>
                <xsl:sort select="."/>
            </xsl:apply-templates>
        </parts>

完整的转换如下

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="objects">
    <parts>
     <xsl:apply-templates>
        <xsl:sort select="."/>
     </xsl:apply-templates>
    </parts>
 </xsl:template>

 <xsl:template match="object">
  <part>
     <xsl:apply-templates/>
  </part>
 </xsl:template>
</xsl:stylesheet>

当应用于提供的XML文档时:

<objects>
    <object>Clutch</object>
    <object>Gearbox</object>
    <object>Cylinder head</object>
    <object>Starter</object>
    <object>Airbox</object>
    <object>Inlet manifold</object>
</objects>

期望得到的正确结果是:

<parts>
   <part>Airbox</part>
   <part>Clutch</part>
   <part>Cylinder head</part>
   <part>Gearbox</part>
   <part>Inlet manifold</part>
   <part>Starter</part>
</parts>

谢谢您。虽然我已经解决了实际代码的问题,但是使用这个示例可能会对我有所帮助。您能否看一下,尽管我现在已经让它工作了。http://stackoverflow.com/questions/11523678/xslt-1-0-sort-on-filtered-xml-data - general exception
1
@generalexception:我正在工作中——将在7-8小时后查看。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接