如何选择xsl:sort条目

时间:2014-04-24 04:12:18

标签: xslt

现在我使用xsl:sort对显示的数据进行排序:

<xsl:sort select="." order="descending" data-type="number" />

我也可以选择替换该行,并按其他值对其进行排序:

<xsl:sort select="@id"  />
<xsl:sort select="@sum" order="descending" data-type="number" />
<xsl:sort select="@count" order="descending" data-type="number" />
<xsl:sort select="@minValue" order="descending" data-type="number" />
<xsl:sort select="@maxValue" order="descending" data-type="number" />

所以它的确如下:

<xsl:for-each select="Metrics/Metric">
   <xsl:sort select="." order="descending" data-type="number" />

   <xsl:value-of select="@id"/> <xsl:value-of select="."/>

</xsl:for-each>

精细。优秀。

现在我想参数化它

我正在采取措施让客户重新排序数据。第一步是能够根据某些条件选择不同的排序。

忽略XSL中参数的可怕复杂性,我将专注于替换单个:

<xsl:sort ... >

<xsl:choose>
    <xsl:when test="1=1">
       <xsl:sort select="." order="descending" data-type="number" />
    </xsl:when>
    <xsl:otherwise>
       <xsl:sort select="." order="descending" data-type="number" />
    </xsl:otherwise>
</xsl:choose>

请注意,我甚至没有尝试介绍不同排序的复杂性。它仍然是xsl:sort,只是包含在xsl:choose

除非它不起作用。不幸的是,没有浏览器会告诉你问题是什么。他们只是说

  

XSLT8690:XSLT处理失败。

enter image description here

这就是XSL开发人员可用的编程工具的范围。

随机尝试其他事情

xsl的一个规则是*“没有理解,只有什么有效,什么没有”。为此,我尝试为xsl 布尔语法提出其他语法:

<xsl:when test="1=1">
<xsl:when test="1==1">
<xsl:when test="1>0">
<xsl:when test="1 > 0">
<xsl:when test="1 &gt; 0">

据我所知,问题与xsl:when无关。

奖金问题

IE或Chrome可以调试xsl吗?我可以放置断点并执行,将鼠标悬停在变量,步骤线上吗?

Bonus Chatter

xml 文件通过样式表包含 xsl 文件:

sqm.xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/xsl' href='sqm.xslt' media='all'?>
<Sqm version="1.2">
   ...
</Sqm>

1 个答案:

答案 0 :(得分:2)

你不能将xsl:sort直接放在条件结构中,所以你在那里选择的布尔表达式并不重要; XSLT无效。但是,你可以这样做:

<xsl:for-each select="Metrics/Metric">
    <xsl:sort select="@id[0 = 1]"  />
    <xsl:sort select="@sum[1 = 1]" order="descending" data-type="number" />
    <xsl:sort select="@count[0 = 1]" order="descending" data-type="number" />   
    <xsl:sort select="@minValue[1 = 1]" order="descending" data-type="number" />
    <xsl:sort select="@maxValue[0 = 1]" order="descending" data-type="number" />

    <xsl:value-of select="@id"/> <xsl:value-of select="."/>
</xsl:for-each>

(当然,你想要使用实际上有意义的布尔表达式,我只是将我的例子基于你的。)

以上内容应首先按@sum对项目进行排序,然后按@minValue对其进行排序,并忽略其他所有内容。

要回答你的奖金问题,我不知道任何浏览器中的任何XSLT调试功能,但某些版本的Visual Studio(我告诉他们,Eclipse)确实提供了XSLT调试功能,以及VS和Eclipse应该给你比你现在得到的更有意义的错误信息。您还可以使用Saxon的命令行工具来解决这些问题。它也应该为您提供有意义的错误消息,例如上面的问题。