2011-08-17 19 views
11

<boolean>spec of Xml-RPC ile uyumlu olmak için xs:boolean'ümü true|false'den 1|0'ya dönüştürmem gerekiyor.Xslt'de boole oluşturma nasıl kontrol edilir

xsx:

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

öğesini kullanarak çözdüm ama xslt 1.0 ile dönüştürüldüğünde boole değerlerinin nasıl işlendiğini kontrol etmenin daha az kırılgan bir yolu olup olmadığını merak ediyordum.

+0

İyi soru, +1. Tam, kısa ve kolay bir çözüm için yanıtımı görün (bir XPath tek liner). :) –

cevap

15

Kullanım: Standart XPath işlevi o üzerinde sırasıyla uygulandığında tam {0, 1}{true(), false()}

Dikkat üretir number() tanımını yaparak

number(boolean(.)) 

! Eğer dizeleri bu inşaat kullanırsanız, sonuç için de geçerli olacak, hem 'yanlış' ve 'gerçek', çünkü dize parametreleri, boolean() is true if and only if its length is non-zero için.

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

: Aşağıda

number(not(. = 'false')) 

XSLT tabanlı doğrulama edilir: Eğer dizeleri değil, Boolean
dönüştürmek istiyorsanız

Yani, o zaman bu ifadeyi kullanmak Bu dönüştürme aşağıdaki XML belgesine uygulandığında:

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

istedik doğru sonuç üretilir:

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

Mükemmel her zaman - ama benim tercih edilen versiyonum 'sayı (boole (.)) 'Işe yaramaz görünmüyor ... her zaman' 1 'döndürüyor. Çözümümde daha genel bir şablon kullanmama izin verecek olan dizge karşılaştırması için gideceğim. – Filburt

+0

'Number (boolean (' false ')) '' 1' i döndürürken, 'number (boolean (false))' '0' döndürecek, böylece mutluluğa kalan kalan soru, literal olmayan değerin nasıl alınacağıdır xs: boolean element ;-) – Filburt

+0

@Filburt: Gerçekten bir boole sahipseniz o zaman şunu kullanın: 'number (.)'. Orada asılı soruların olmasının nedeni, tam bir XML belgesi ve istenen tam sonucu sağlamadığınızdır. İnsanlar bunları tahmin ettiğinde,% 10'luk başarı oranı bile çok büyük. –

İlgili konular