我想按升序对这些元素进行排序,但是空值最后而不是第一个,这似乎是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> </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) ) )
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。