【问题标题】:Why doesn't xsl:sort work when using xsl:key?为什么使用 xsl:key 时 xsl:sort 不起作用?
【发布时间】:2014-05-25 23:04:44
【问题描述】:

鉴于此 XML:

<?xml version="1.0" encoding="utf-8" ?>
<data>
    <chapter-section-datasource>
        <section id="12" handle="chapter-section">Chapter Section</section>
        <entry id="94">
            <order handle="1">1</order>
        </entry>
    </chapter-section-datasource>
    <page-content>
        <section id="9" handle="page-content">x</section>
        <chapter-section link-id="94">
            <entry id="87">
                <section-id>0</section-id>
            </entry>
            <entry id="91">
                <section-id>2</section-id>
            </entry>
            <entry id="93">
                <section-id>1</section-id>
            </entry>
            <entry id="103">
                <section-id>3</section-id>
            </entry>
        </chapter-section>
    </page-content>
</data>

还有这个 XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="data">
    <xsl:apply-templates select="chapter-section-datasource/entry[1]" mode="bal"/>
  </xsl:template>

  <!-- Map Results -->
  <xsl:key name="guide" match="chapter-section" use="@link-id" />

  <xsl:template match="entry" mode="bal">
    <xsl:apply-templates select="key('guide', @id)" mode="balGuide">
      <xsl:sort select="section-id" data-type="number" order="ascending" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="chapter-section/entry" mode="balGuide">
    <xsl:element name="div">
          <xsl:value-of select="section-id"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

预期输出为:0,1,2,3

实际输出为:0,2,1,3

为什么排序没有按我的预期工作?请注意,转换的复杂性是由于更复杂的 XML 和 XSL 已为本示例进行了简化。

如果重要的话,转换是在 C# 中完成的

System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(Server.MapPath("Xml/simple.xml"));
System.Xml.Xsl.XslTransform trans = new System.Xml.Xsl.XslTransform();
trans.Load(Server.MapPath("Xml/simple.xsl"));
Xml1.Document = doc;
Xml1.Transform = trans;

【问题讨论】:

    标签: xml xslt transform


    【解决方案1】:

    你需要

      <xsl:template match="entry" mode="bal">
        <xsl:apply-templates select="key('guide', @id)/entry" mode="balGuide">
          <xsl:sort select="section-id" data-type="number" order="descending" />
        </xsl:apply-templates>
      </xsl:template>
    

    也就是说,您需要确保处理和排序 entry 元素(而不是唯一的父元素,不会发生排序,默认模板会按原始顺序处理 entry 元素)。

    这里是一个完整的样式表,也改变了order="ascending",你说你想要0,1,2,3

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:template match="data">
        <xsl:apply-templates select="chapter-section-datasource/entry[1]" mode="bal"/>
      </xsl:template>
    
      <!-- Map Results -->
      <xsl:key name="guide" match="chapter-section" use="@link-id" />
    
      <xsl:template match="entry" mode="bal">
        <xsl:apply-templates select="key('guide', @id)/entry" mode="balGuide">
          <xsl:sort select="section-id" data-type="number" order="ascending" />
        </xsl:apply-templates>
      </xsl:template>
    
      <xsl:template match="chapter-section/entry" mode="balGuide">
        <div>
              <xsl:value-of select="section-id"/>
        </div>
      </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 2021-11-08
      • 2021-11-14
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2013-05-17
      相关资源
      最近更新 更多