给出以下状态顺序: 最差 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可能不在此处使用。
答案 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>