如何按照给定的用户定义顺序对XSLT进行排序

时间:2019-07-19 11:05:12

标签: xml xslt

给出以下状态顺序: 最差 0,1,2,3,4,5,6,G,U,Q,。,V,R,I,X,D

我如何在下面进行排序并得到最差的结果:

<Details>
  <status>U</status>
</Details>
<Details>
  <status>0</status>
</Details>
<Details>
  <status>X</status>
</Details>
<Details>
  <status>D</status>
</Details>
<Details>
  <status>1</status>
</Details>
<Details>
  <status>2</status>
</Details>

我尝试将状态编码为数字,然后排序并获得最大值,但是出现问题:

<xsl:variable name="MaxWorstStatus">
    <xsl:for-each select="//ic:Details/ic:status">
        <xsl:variable name="Status">
            <xsl:call-template name="encodeStatus">
                <xsl:with-param name="Node" select="."/>                                                 
            </xsl:call-template>                                     
        </xsl:variable>
        <xsl:sort select="$Status" data-type="text" order="descending"/>                                         
        <xsl:if test="position() = 1"><xsl:value-of select="$Status"/</xsl:if>
    </xsl:for-each>
</xsl:variable>

<xsl:template name="encodeStatus">
    <xsl:param name="Node"/>
    <xsl:choose>
        <xsl:when test="$Node='U'">7</xsl:when>
        <xsl:when test="$Node='G'">8</xsl:when>
        <xsl:when test="$Node='Q'">9</xsl:when>
        <xsl:when test="$Node='.'">10</xsl:when>
        <xsl:when test="$Node='V'">11</xsl:when>
        <xsl:when test="$Node='R'">12</xsl:when>
        <xsl:when test="$Node='I'">13</xsl:when>
        <xsl:when test="$Node='X'">14</xsl:when>
        <xsl:when test="$Node='D'">15</xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$Node"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

我期望返回15,但出现以下错误: 代码:0x80004005 关键字xsl:sort可能不在此处使用。

2 个答案:

答案 0 :(得分:0)

XSLT为此具有简单的功能。使用<xslt:sort select="">应该可以正常工作。使用<xsl:value-of select="last()" />,您可以选择的最后一行。

这里是一个示例:

    <xsl:variable name="MaxWorstStatus">
        <xsl:for-each select="//ic:Details/ic:status">
            <xsl:variable name="Status">
                <xsl:call-template name="encodeStatus">
                    <xsl:with-param name="Node" select="."/>                                                 
                </xsl:call-template>                                     
            </xsl:variable>
            <xsl:sort select="$Status" data-type="text" order="descending"/>                                         
            <xsl:if test="position() = 1"><xsl:value-of select="$Status"/</xsl:if>
        </xsl:for-each>
    </xsl:variable>

    <xsl:template name="encodeStatus">
        <xsl:param name="Node"/>
        <xsl:for-each select="$Node">
            <xslt:sort select="$Node" />
        </xsl:for-each >
        <xsl:value-of select="last($Node)" />
    </xsl:template>

答案 1 :(得分:0)

如果您可能的status值全部为1个字符,则可以这样定义变量:

<xsl:variable name="order">0123456GUQ.VRIXD</xsl:variable>

然后您的排序就变成了...

<xsl:sort select="string-length(substring-before($order, .))" data-type="number" order="descending"/>

请改用xsl:for-each

  <xsl:for-each select="//ic:Details/ic:status">
    <xsl:sort select="string-length(substring-before($order, .))" data-type="number" order="descending"/>                                         
    <xsl:if test="position() = 1">
      <xsl:value-of select="string-length(substring-before($order, .))"/>
    </xsl:if>
  </xsl:for-each>