<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», в зависимости от того, является дочерним текстовым узлом или нет. Это объединение двух взаимоисключающих строк - if / then / else бедного человека в XPath 1.0.
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)
)
)