XSL按位置排序()给出了奇怪的结果

时间:2010-08-09 09:25:13

标签: xml xslt sorting

我有一个XML文件,其内容我想按文档顺序排序(基本上按照写出项目的顺序)。

我目前使用以下代码:

<xsl:template match="/Error">
        <xsl:apply-templates>
            <xsl:sort select="position()" order="descending" />
        </xsl:apply-templates>
</xsl:template>

<xsl:template match="/Error/Warning">
<!-- etc -->
</xsl:template>

示例XML(为便于阅读而替换数据):

<Error>
<Warning data="stuff" timestamp="08:26:17 2010/08/01">CODE.1</Warning>
<Clear data="stuff" timestamp="08:26:36 2010/08/01">CODE.2</Clear>
<Warning data="stuff" timestamp="08:36:00 2010/08/01">CODE.3</Warning>
<Clear data="stuff" timestamp="08:36:56 2010/08/01">CODE.4</Clear>
<Warning data="stuff" timestamp="08:40:31 2010/08/01">CODE.5</Warning>
</Error>
然而,这似乎给出了奇怪的结果,因为它似乎没有特别的顺序!有什么想法吗?

删除排序似乎使其正常工作 - 这是否可以按写入顺序对其进行可靠排序,还是无法保证?

3 个答案:

答案 0 :(得分:1)

你不知道要将模板应用到哪个节点?

例如:

<xsl:apply-templates select="/Error/messages" />

在处理xslt问题时使用你正在处理的xml会很不错。

答案 1 :(得分:1)

<xsl:apply-templates />按文档顺序对选定的节点集进行操作,删除sort元素,这将根据需要运行。请参阅:Applying Template Rules

答案 2 :(得分:1)

不应该这样吗?在apply-templates上使用select属性?

<xsl:template match="/Error">
  <xsl:apply-templates select="./Warning" />
</xsl:template>

<xsl:template match="/Error/Warning">
  <!-- etc -->
</xsl:template>

您应该按照XML源中的顺序获取输出。