我想按升序对这些元素进行排序,但是空值最后而不是第一个,这似乎是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)
)
)
