Как управлять логическим отображением в xslt
в соответствии с <boolean>
спецификации Xml-RPC мне нужно преобразовать мой xs:boolean
С true|false
to 1|0
.
я решил это с помощью xsl: выберите
<xsl:template match="Foo">
<member>
<name>Baz</name>
<value>
<boolean>
<xsl:choose>
<xsl:when test=".='true'">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</boolean>
</value>
</member>
</xsl:template>
но было интересно, есть ли менее хрупкий способ управления тем, как логические значения отображаются при преобразовании с помощью xslt 1.0.
1 ответов
использовать:
number(boolean(.))
по определению стандартной функции XPath number()
он производит точно {0, 1}
при применении, соответственно, на {true(), false()}
остерегайтесь! если вы используете эту конструкцию на строки, результат относится и 'ложь' и 'правда', потому что для параметров строки boolean () истинно тогда и только тогда, когда его длина ненулевое.
Итак, если вы хотите преобразовать строки, а не логические значения, затем используйте это выражение:
number(not(. = 'false'))
Ниже приведена проверка на основе XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="number(not(. = 'false'))"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему XML-документу:
<t>
<x>true</x>
<y>false</y>
</t>
производится нужный, правильный результат:
<t>
<x>1</x>
<y>0</y>
</t>