【问题标题】:XSLT 1.0 sort elementsXSLT 1.0 排序元素
【发布时间】:2012-07-17 12:54:27
【问题描述】:

我有以下 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>

为什么&lt;xsl:sort select="object"/&gt; 没有被应用?

【问题讨论】:

    标签: xml xslt sorting


    【解决方案1】:

    原因在这里:

          <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>
    

    【讨论】:

    • 感谢您。我的实际代码有问题,尽管使用这个例子会对我有所帮助。任何机会你都可以看看,即使我现在已经让它工作了。 stackoverflow.com/questions/11523678/…
    • @generalexception:我在工作——7-8 小时后看看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2021-05-05
    相关资源
    最近更新 更多