2011-08-17 14 views
11

में बूलियन प्रतिपादन नियंत्रित करने के लिए <boolean>spec of Xml-RPC मैं 1|0 को true|false से मेरी xs:boolean को बदलने की जरूरत है के अनुरूप करने के लिए।कैसे xslt

मैं इस का उपयोग कर 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 के साथ बदल गाया रहे हैं की एक कम भंगुर तरीका है सोच रहा था।

+0

अच्छा सवाल है, +1। एक पूर्ण, संक्षिप्त और आसान समाधान (एक XPath एक-लाइनर) के लिए मेरा उत्तर देखें। :) –

उत्तर

15

उपयोग:

number(boolean(.)) 

मानक XPath समारोह number() यह पैदा करता है वास्तव में {0, 1} जब क्रमश: लागू किया पर {true(), false()}

खबरदार की परिभाषा के अनुसार! यदि आप इस निर्माण का उपयोग स्ट्रिंग्स पर करते हैं, तो परिणाम दोनों 'झूठी' और 'सत्य' दोनों के लिए सच होगा, क्योंकि स्ट्रिंग पैरामीटर के लिए boolean() is true if and only if its length is non-zero

इसलिए, यदि आप तार, नहीं बूलियन्स परिवर्तित करना चाहते हैं, तो यह अभिव्यक्ति का उपयोग:

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

:

number(not(. = 'false')) 

नीचे एक XSLT आधारित सत्यापन है जब यह परिवर्तन निम्न XML दस्तावेज़ पर लागू होता है:

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

चाहता था, सही परिणाम उत्पादन किया जाता है:

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

उत्कृष्ट अल हमेशा हमेशा - लेकिन मेरा पसंदीदा संस्करण 'संख्या (बूलियन (।)) 'काम नहीं लग रहा है ... यह हमेशा' 1' देता है। मैं स्ट्रिंग तुलना के लिए जाऊंगा जो मुझे मेरे समाधान में एक और सामान्य टेम्पलेट का उपयोग करने की अनुमति देगा। – Filburt

+0

ऐसा लगता है कि 'संख्या (बूलियन (' झूठी ')) '' 1' वापस आ जाएगी जबकि 'संख्या (बूलियन (झूठी))' 0' वापस आ जाएगी, इसलिए अंतिम खुशी का शेष प्रश्न यह है कि गैर-शाब्दिक मूल्य कैसे प्राप्त किया जाए एक एक्सएस: बूलियन तत्व ;-) – Filburt

+0

@ फ़िलबर्ट: यदि आपके पास वास्तव में एक बूलियन है तो उपयोग करें: 'संख्या (।) '। अभी भी चारों ओर लटकने वाले प्रश्नों का कारण यह है कि आपने एक पूर्ण XML दस्तावेज़ और इच्छित पूर्ण परिणाम प्रदान नहीं किया है। जब लोग इन अनुमान लगा रहे हैं, तो 10% सफलता दर भी बड़ी है। –