как сортировать xsl по возрастанию с нулями в последний раз

Я хочу отсортировать эти элементы в порядке возрастания, но с нулевыми значениями в последнюю очередь, а не в начале, что, по-видимому, и делает xslt по умолчанию. Мне удалось это сделать, но я думаю, есть ли лучший способ. Вот мой пример.

<b>
    <c>2</c>
    <c>1</c>
    <c>3</c>
    <c></c>
    <c>15</c>
    <c>11</c>
    <c></c>
    <c>43</c>
    <c>4</c>
</b>


<xsl:template match="/">
    <xsl:for-each select="b/c">
        <xsl:sort select="node() = false()"/>
        <xsl:sort select="." data-type="number"/>
        Row<xsl:value-of select="position()"/>:<xsl:value-of select="."/>
    </xsl:for-each>
</xsl:template>

Который дает требуемый результат:

Row1:1
Row2:2
Row3:3
Row4:4
Row5:11
Row6:15
Row7:43
Row8:
Row9:  

В настоящее время я использую <xsl:sort select="node() = false()"/>, чтобы проверить его на нулевое значение, а затем использую сортировку, чтобы упорядочить нулевые элементы последними (ноль будет 1, а не NULL, будет 0, поэтому он правильно их упорядочивает.

Кто-нибудь может предложить что-нибудь лучше, чем это?

4 голоса | спросил Chris R 8 +04002009-10-08T19:26:44+04:00312009bEurope/MoscowThu, 08 Oct 2009 19:26:44 +0400 2009, 19:26:44

1 ответ


0
<xsl:template match="/">
  <xsl:for-each select="b/c">
    <xsl:sort select="concat(
      substring('1', 1, boolean(text())),
      substring('0', 1, not(boolean(text())))
    )" />
    <xsl:sort select="." data-type="number"/>
    <xsl:text>Row</xsl:text>
    <xsl:value-of select="position()"/>
    <xsl:text>:</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&#10;</xsl:text>
  </xsl:for-each>
</xsl:template>

Это:

concat(
  substring('1', 1, boolean(text()) ),
  substring('0', 1, not(boolean(text())))
)

Создает либо '0', либо '1', в зависимости от того, есть ли дочерний текстовый узел или нет. Это объединение двух взаимоисключающих строк - if /then /else бедного человека в XPath 1.0.

boolean(text()) создает true или false, который затем преобразуется в число для substring()

Более полная версия вышеприведенного выглядит следующим образом:

concat(
  substring(
    $if_str, 
    1, 
    boolean($condition) * string-length($if_str)
  ),
  substring(
    $else_str, 
    1, 
    not(boolean($condition)) * string-length($else_str)
  )
)
ответил Tomalak 8 +04002009-10-08T20:00:10+04:00312009bEurope/MoscowThu, 08 Oct 2009 20:00:10 +0400 2009, 20:00:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132