为什么在使用xsl:key时没有xsl:sort工作?

时间:2014-04-11 17:05:43

标签: xml xslt transform

鉴于此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;

1 个答案:

答案 0 :(得分:2)

你需要

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