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