Как управлять булевым рендерингом в xslt

Чтобы соответствовать спецификации <boolean> для Xml-RPC Мне нужно преобразовать мой xs:boolean из true|false в 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()}

Осторожно! Если вы используете эту конструкцию в строках, результат будет быть истинным как для "false", так и для "true" , потому что для параметров строки boolean() true тогда и только тогда, когда его длина не равна нулю.

Итак, если вы хотите преобразовать строки, а не booleans, используйте это выражение:

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>

Ответ 2

I have same query, however I want produce the string which passed.

for eg:

<xsl:for-each select="catalog/cd">
      <tr>
        <td><xsl:value-of select="title = 'Empire Burlesque'" /></td>
        <td><xsl:value-of select="artist = 'Bob Dylan'" /></td>
 </tr>

Выходной я получаю

Желание выхода нужно вместо "правда" мне нужно "Империя Бурлеск" "Боб Дилан".

пожалуйста помоги

Спасибо