2012-01-12 14 views
8

यह जावा प्रोग्राम टर्नरी का उपयोग करता है, अगर आउटपुट स्ट्रिंग्स के लिए बुलियन को मैप करने के लिए: (एक "*" सत्य के लिए, गलत के लिए एक खाली स्ट्रिंग)।एक्सएसएलटी 1.0 इडियॉम टर्नरी के लिए अगर?

public class ternary { 
    public static void main(String[] args) { 
    boolean flags[]={true,false,true}; 
    for (boolean f : flags) { 
     System.out.println(f?"*":""); 
    } 
    } 
} 

तो आउटपुट *, [खाली], * है।

मैं, कुछ की तरह एक इनपुट XML दस्तावेज़ है:

<?xml version="1.0" ?> 
<?xml-stylesheet type="text/xsl" href="change.xsl"?> 
<root> 
    <change flag="true"/> 
    <change flag="false"/> 
    <change flag="true"/> 
</root> 

और मैं जो '*' के लिए सही और 'को' झूठा नक्शे निम्नलिखित XSLT टेम्पलेट (यह काम करता है):

<xsl:template match="change"> 
    <xsl:variable name="flag" select="translate(substring(@flag,1,1),'tf','*')"/> 
    <xsl:value-of select="$flag"/> 
</xsl:template> 

क्या इसका संक्षिप्त संस्करण है?

ए) क्या मैं स्वचालित रूप से स्ट्रिंग 'सत्य | झूठी' से सीधे बूलियन सत्य का झूठा मूल्य प्राप्त कर सकता हूं? बी) क्या कोई (xpath?) बूलियन सत्य को मानचित्र बनाने के लिए बनाता है | '*', '' के लिए झूठा?

+0

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/971067/is-there-an-if-then-else-statement-in-xpath – Vadzim

उत्तर

8

ए) क्या मैं स्वचालित रूप से स्ट्रिंग 'सत्य | झूठी' से सीधे बूलियन सत्य का मूल्य प्राप्त कर सकता हूं?

बी) क्या बूलियन सत्य को मानचित्रित करने के लिए कोई (xpath?) निर्माण है। '*', ''?

यह वास्तव में एक XPath प्रश्न है।

मैं XPath 1.0

वहाँ एक से अधिक xPath अभिव्यक्ति मूल्यांकन जिनमें से वांछित परिणाम पैदा कर रहे हैं:

substring('*', 2 -(@flag = 'true')) 

यह भी जवाब देता ख) - ध्यान दें कि तार'true' और 'false' बुलियन मूल्य नहीं हैं! केवल दो बूलियन मान true() और false() हैं और वे तार नहीं हैं।

उपर्युक्त अभिव्यक्ति में हम इस तथ्य का उपयोग करते हैं कि XPath 1.0 में यदि एक बूलियन एक संदर्भ में है जहां एक संख्या की आवश्यकता है, तो यह स्वचालित रूप से संख्या में परिवर्तित हो जाता है।परिभाषा के अनुसार:

number(true())1

और

number(false()) है 0

इस प्रकार दूसरा ऊपर substring() करने के लिए कॉल की तर्क है:

2 - (@flag = 'true') 

1 जब @flag = 'true' के रूप में मूल्यांकन किया जाता है तथा अन्यथा 2 पर।

एक अधिक सामान्य XPath 1.0 अभिव्यक्ति यदि $val"x" है और स्ट्रिंग $s2 अगर $val पैदा करता है कि स्ट्रिंग $s1 पैदा करता "y" है:

concat(substring($s1, 1 div ($val = "x")), 
     substring($s2, 1 div ($val = "y")) 
    ) 

इस स्ट्रिंग $s1 जब $val = "x", स्ट्रिंग का उत्पादन $s2 जब $val = "y", और खाली स्ट्रिंग - यदि इन दो स्थितियों में से कोई भी नहीं है।

ऊपर XPath 1.0 अभिव्यक्ति $s1, $2, ..., $sN वास्तव में जब $val मूल्यों में से एक है $v1, $v2, ..., $vN समारोह concat() हो सकता है क्योंकि एन अलग स्ट्रिंग परिणाम का उत्पादन करने के सामान्यीकृत किया जा सकता तर्कों की कोई संख्या।


II। XPath 2.0 (XSLT 2,0)

'*'[current()/@flag = 'true'] 

और अधिक आम तौर पर, यह देखते हुए 2 * एन परमाणु मूल्यों $s1, $s2, ... $sN और $v1, $v2, ..., $vN, सभी $vi मान भिन्न हैं जैसे कि , इस XPath 2.0 अभिव्यक्ति का मूल्यांकन का परिणाम:

($s1, $s2, ..., $sN)[index-of(($v1, $v2, ..., $vN), $v)] 

$sK वास्तव में जब $v eq $vK है।

+0

इसके लिए बहुत धन्यवाद - क्यों '2-x' और नहीं ' 1-एक्स 'यद्यपि? – monojohnny

+0

@monojohnny: अच्छा सवाल। '2-x' का कारण 1 या 2 प्राप्त करना है। XPaths अनुक्रमण 1-आधारित है, 0-आधारित नहीं है। –

+0

आह हाँ, मैं भूल गया कि एक्सएसएल तार 1-बाध्य हैं! चीयर्स! समझ में आता है। – monojohnny

1

आप इसके लिए टेम्पलेट्स में सरल पैटर्न मिलान का उपयोग कर सकते हैं।

<xsl:template match="change[@flag = 'true']"> 

<xsl:template match="change"> 

तो, पहले एक सच प्रविष्टियों से मेल खाता है, और अन्य एक अन्य सभी मामलों से मेल खाता है (जो आपके मामलों में सिर्फ गलत है

तो, निम्नलिखित स्टाइलशीट

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="change[@flag = 'true']"> 
     <xsl:text>*&#13;</xsl:text> 
    </xsl:template> 

    <xsl:template match="change"> 
     <xsl:text>&#13;</xsl:text> 
    </xsl:template> 

    <xsl:template match="@*|node()"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:template> 
</xsl:stylesheet> 
दिया

आपके नमूना एक्सएमएल पर लागू होने पर, निम्नलिखित आउटपुट

* 

* 
संबंधित मुद्दे