Учитывая следующий порядок статусов: Лучший Худший 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.





Если ваши возможные значения 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>
Я не думал об использовании подстроки, спасибо, это сработало как шарм
Вы должны указать, какую версию XSLT вы используете. В XSLT 2.0 вы можете поместить свою логику для вычисления ключа сортировки в пользовательскую функцию xsl:, а затем вызвать функцию в
xsl:sort/@select. В XSLT 1.0 вы должны вычислить его в однострочном выражении XPath.