簡體   English   中英

為什么使用xsl:key時xsl:sort不起作用?

[英]Why doesn't xsl:sort work when using xsl:key?

鑒於此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所致,在本示例中,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;

你需要

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM