2011-11-14 28 views
8

मैं एक वैरिएबल घोषित करने की कोशिश कर रहा हूं जिसमें डिफ़ॉल्ट मान है या यदि एक नया अलग मूल्य का उपयोग करने के लिए दोहराने वाले सेट में कोई मान मौजूद है।एक्सएसएलटी डिफ़ॉल्ट वैरिएबल वैल्यू यदि मूल्य मौजूद नहीं है

यह मेरे पास अब तक है।

 <xsl:variable name="lsind"> 
     <xsl:value-of select="'N'"/> 

     <xsl:for-each select='./Plan/InvestmentStrategy/FundSplit'> 
      <xsl:choose> 
      <xsl:when test="contains(./@FundName, 'Lifestyle')"> 
       <xsl:value-of select="'Y'"/> 
      </xsl:when> 
      </xsl:choose> 
     </xsl:for-each> 
     </xsl:variable> 

क्या मैं चाहता हूँ ./Plan/InvestmentStrategy/FundSplit/@FundName से किसी उदाहरण की तो बॉलीवुड 'शामिल' lsind 'वाई अन्यथा इसे वापस' एन 'का डिफ़ॉल्ट मान के लिए होता है।

मैं इसे इस तरह से कर रहा हूं जैसे कि मैं उपयोग करता हूं 'अन्यथा आखिरी घटना संभावित रूप से एन को वापस सेट कर सकती है?

कोई सुझाव?

उत्तर

12
<xsl:variable name="lsind"> 
    <xsl:choose> 
    <xsl:when test="Plan/InvestmentStrategy/FundSplit[contains(@FundName, 'Lifestyle')]"> 
     <xsl:text>Y</xsl:text> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>N</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

पर्याप्त होना चाहिए

+1

आप एक सुंदर इंसान हैं। धन्यवाद! मैं बस एक्सपैथ मार्ग का पता लगाना शुरू कर रहा था कि संदेह है कि एक रास्ता होना चाहिए। –

4

यह (XPath 1.0 में भी) एक एकल XPath अभिव्यक्ति में निर्दिष्ट किया जा सकता:

<xsl:variable name="vLsind" select= 
"substring('YN', 
      2 - boolean(plan/InvestmentStrategy/FundSplit[@FundName='Lifestyle']), 
      1)"/> 

उदाहरण 1:

<plan> 
<InvestmentStrategy> 
    <FundSplit FundName="Lifestyle"/> 
</InvestmentStrategy> 
</plan> 

परिवर्तन:

<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:variable name="vLsind" select= 
"substring('YN', 
      2 - boolean(plan/InvestmentStrategy/FundSplit[@FundName='Lifestyle']), 
      1)"/> 

<xsl:template match="/"> 
    <xsl:value-of select="$vLsind"/> 
</xsl:template> 
</xsl:stylesheet> 

परिणाम:

Y 

उदाहरण 2:

<plan> 
<InvestmentStrategy> 
    <FundSplit FundName="No Lifestyle"/> 
</InvestmentStrategy> 
</plan> 

परिणाम:

N 

स्पष्टीकरण:

  1. परिभाषा boolean(some-node-set) तक true() है वास्तव में जब some-node-set गैर खाली है।

  2. परिभाषा number(true()) तक 1 है और number(false())0

  3. 1 और 2 cobined हमें देता है: number(boolean(some-node-set))1 है वास्तव में जब some-node-set गैर खाली है, अन्यथा यह 0 है।

अन्य एकल अभिव्यक्ति समाधान:

XPath 1।0:

translate(number(boolean(YourXPathExpression)), '10', 'YN') 

XPath 2.0:

if(YourXPathExpression) 
then 'Y' 
else 'N' 

या यहां तक ​​कि:

('N', 'Y')[number(boolean(YourXPathExpression)) +1] 
+0

+1 XPath 1.0 फ़ंक्शंस का उपयोग करके वे कुछ गलत उदाहरण हैं (गलत)! – Goran

+4

@ गोरान: क्या यह पुलिस विभाग ने कहा था? यदि * यह * दुरुपयोग है, तो मैं बहुत बड़ी परेशानी के लिए हूं ... :) –

+0

@DimitreNovatchev। इसका दुरुपयोग नहीं किया जाता है, लेकिन यह बहुत उलझन में हो सकता है, क्योंकि यह एक अभिव्यक्ति के भीतर एक तार्किक निर्माण का मुखौटा बनाता है, जो लंबे समय तक रखरखाव के लिए अच्छा नहीं हो सकता है, जितना अधिक हो, या जो भी उनके बाद आता है, उन्हें अपने सिर को पाने की कोशिश करनी पड़ सकती है हर बार जब वे इसे फिर से देखते हैं। – Patanjali

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