加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 如何xsl以最后的空值升序排序

发布时间:2020-12-16 22:53:18 所属栏目:百科 来源:网络整理
导读:我想按升序对这些元素进行排序,但是空值最后而不是第一个,这似乎是xslt默认执行的操作.我设法做到这一点,但想知道是否有更好的方法.这是我的例子. b c2/c c1/c c3/c c/c c15/c c11/c c/c c43/c c4/c/bxsl:template match="/" xsl:for-each select="b/c" 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()”/>测试它是否为null然后使用排序最后对null元素进行排序(null将为1而非null将为0,因此它正确排序它们).

谁能提出比这更好的建议?

解决方法

<xsl:template match="/">
  <xsl:for-each select="b/c">
    <xsl:sort select="concat(
      substring('1',1,boolean(text())),substring('0',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',boolean(text()) ),not(boolean(text())))
)

生成“0”或“1”,具体取决于是否存在子文本节点.它是两个互斥字符串的串联 – XPath 1.0中的穷人if / then / else.

boolean(text())产生true或false,然后转换为substring()的数字.布尔值分别转换为1或0.

以上更完整的版本是这样的:

concat(
  substring(
    $if_str,boolean($condition) * string-length($if_str)
  ),substring(
    $else_str,not(boolean($condition)) * string-length($else_str)
  )
)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读