2011-08-17 13 views
11

Per conformarsi alla <boolean>spec of Xml-RPC ho bisogno di trasformare il mio xs:boolean da true|false a 1|0.Come controllare il rendering booleano in XSLT

Ho risolto questo utilizzando xsl: choose

<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> 

ma chiedevo se c'è un modo meno fragile di controllare come i valori booleani sono resi quando trasformata con XSLT 1.0.

+0

Buona domanda, +1. Vedi la mia risposta per una soluzione completa, breve e facile (una carta unica XPath). :) –

risposta

15

Uso:

number(boolean(.)) 

Per la definizione della funzione XPath norma number() produce esattamente {0, 1} quando applicati, rispettivamente, sulla {true(), false()}

Attenzione! Se si utilizza questa costruzione su stringhe, il risultato sarà valido per entrambi 'false' e 'true', perché, per i parametri di stringa, boolean() is true if and only if its length is non-zero.

Quindi, se si desidera convertire stringhe, non booleani, quindi usare questa espressione:

number(not(. = 'false')) 

Qui di seguito è una verifica XSLT basata:

<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> 

quando questa trasformazione viene applicata al seguente documento XML:

<t> 
<x>true</x> 
<y>false</y> 
</t> 

il voluto, risultato corretto è prodotta:

<t> 
    <x>1</x> 
    <y>0</y> 
</t> 
+0

Eccellente sempre - ma la mia versione preferita 'numero (booleano (.))' Sembra non funzionare ... restituisce sempre '1'. Vado per il confronto delle stringhe che mi consentirà di utilizzare un modello più generico nella mia soluzione. – Filburt

+0

Sembra 'numero (booleano ('falso'))' restituirà '1' mentre' numero (booleano (falso)) 'restituirà' 0' quindi la domanda rimanente per la felicità finale è come recuperare il valore non letterale di una xs: elemento booleano ;-) – Filburt

+0

@Filburt: Nel caso in cui tu abbia davvero un booleano allora usa: 'numero (.)'. La ragione per cui ci sono ancora delle domande è che non hai fornito un documento XML completo e il risultato completo desiderato. Quando le persone indovinano questi, anche il 10% del tasso di successo è enorme. –

Problemi correlati