我想按升序对这些元素进行排序,但是空值最后而不是第一个,这似乎是xslt默认执行的操作.我设法做到这一点,但想知道是否有更好的方法.这是我的例子. b c2/c c1/c c3/c c/c c15/c c11/c c/c c43
<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', 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> </xsl:text> </xsl:for-each> </xsl:template>
这个:
concat( substring('1', 1, boolean(text()) ), substring('0', 1, not(boolean(text()))) )
生成“0”或“1”,具体取决于是否存在子文本节点.它是两个互斥字符串的串联 – XPath 1.0中的穷人if / then / else.
boolean(text())产生true或false,然后转换为substring()的数字.布尔值分别转换为1或0.
以上更完整的版本是这样的:
concat( substring( $if_str, 1, boolean($condition) * string-length($if_str) ), substring( $else_str, 1, not(boolean($condition)) * string-length($else_str) ) )