2010-11-17 17 views
18

इस कोड को काम करने के लिए मैं क्या कर सकता हूं?एक्सएसएलटी: क्या मैं वैश्विक स्तर पर एक चर घोषित कर सकता हूं और बाद में इसे मान सकता हूं

<xsl:choose> 
    <xsl:when test='type = 6'> 
    <xsl:variable name='title' select='root/info/title' /> 
    </xsl:when> 
    <xsl:when test='type = 7'> 
    <xsl:variable name='title' select='root/name' /> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:variable name='title'>unknown</xsl:variable> 
    </xsl:otherwise> 
</xsl:choose> 

<div class='title'> 
    <xsl:value-of select='$title'/> 
</div> 

इसका कारण यह है काम नहीं करता है जब मैं करना <xsl:value-of select='$title'/>, $title दायरे से बाहर है। मैंने दायरे के बाहर <xsl:variable name='title'/> लाइन जोड़ने की कोशिश की, लेकिन यह या तो काम नहीं करेगा, क्योंकि जब मैं <xsl:variable name='title' select='root/info/title' /> को उदाहरण के लिए कॉल करता हूं, तो मैंने पहले ही इस चर को सेट कर दिया है। मुझे इसे कैसे हल करना चाहिए?

+1

अच्छा सवाल, +1। तीन अलग-अलग समाधानों के लिए मेरा उत्तर देखें। :) –

उत्तर

27

आप स्थानांतरित कर सकते हैं इस तरह चर की अंदर चुनते हैं, तो:

<xsl:variable name="title"> 
    <xsl:choose> 
    <xsl:when test='type=6'> 
     <xsl:value-of select="root/info/title" /> 
    </xsl:when> 
    ... 
    </xsl:choose> 
</xsl:variable> 

<div class='title'> 
    <xsl:value-of select="$title" /> 
</div> 
+1

हाँ, यही वह है जो मैं भी सोच रहा था। मुझे इस समाधान को बहुत पसंद नहीं है क्योंकि मेरे पास 20 से अधिक प्रकार हैं, जिनमें से प्रत्येक को 5 चर की आवश्यकता है। यदि मैं उन सभी 5 चरों को प्रत्येक प्रकार के लिए एक दूसरे के बाद सूचीबद्ध कर सकता हूं, जो मेरे कोड को और अधिक स्पष्ट कर देगा, और यह एक और प्रकार जोड़ना आसान होगा। आपके द्वारा सुझाए गए समाधान के साथ, यदि पांच चरों में से प्रत्येक में नए प्रकार के लिए एक लाइन जोड़नी है। लेकिन मुझे लगता है कि कोई और रास्ता सही नहीं होगा। मैं इसे प्राप्त करूँगा, उत्तर के लिए धन्यवाद :) –

+0

आप प्रत्येक चर के अंदर एक कॉल-टेम्पलेट चुन सकते हैं, और उसके बाद एक टेम्पलेट में चयन करें। – carols10cents

+0

ओह, लेकिन प्रतीक्षा करें - फिर आपको यह जांचना होगा कि आप किस चर के लिए टेम्पलेट के अंदर सेटिंग कर रहे हैं;) – carols10cents

3

आप एक्सएसएलटी (1.0) में चर को फिर से असाइन नहीं कर सकते हैं। नाम शायद सौभाग्य से नहीं चुना गया है; एक xsl:variable एक चर से अधिक प्रतीक है।

अपने नमूना में आप निम्न का उपयोग कर सकते हैं:

<xsl:variable name='title'> 
    <xsl:choose> 
    <xsl:when test='type = 6'> 
     <xsl:value-of select='root/info/title' /> 
    </xsl:when> 
    <xsl:when test='type = 7'> 
     <xsl:value-of select='root/name' /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>unknown</xsl:text> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
+0

यह एक चरम है, निरंतर शाब्दिक नहीं है। लेकिन यह घोषणात्मक प्रतिमान में एक चर है: एक समीकरण में एक चर की तरह। –

+1

@Alejandro: हाँ, मैं माइकल Kay द्वारा वर्णित गणितीय अर्थ में प्रतीक/चर का जिक्र कर रहा था: "कुछ लोगों ने पूछा है, यदि आप इसे अलग नहीं कर सकते हैं तो इसे एक चर क्यों कहते हैं? इसका जवाब पारंपरिक गणितीय में है शब्द परिवर्तनीय का उपयोग: एक चर एक प्रतीक है जिसका उपयोग विभिन्न अवसरों पर विभिन्न मूल्यों को दर्शाने के लिए किया जा सकता है। " (http://gandhimukul.tripod.com/xslt/facts.html) –

11
<xsl:choose> 
    <xsl:when test='type = 6'> 
    <xsl:variable name='title' select='root/info/title' /> 
    </xsl:when> 
    <xsl:when test='type = 7'> 
    <xsl:variable name='title' select='root/name' /> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:variable name='title'>unknown</xsl:variable> 
    </xsl:otherwise> 
</xsl:choose> 

<div class='title'> 
    <xsl:value-of select='$title'/> 
</div> 

यह नहीं करता है ' टी काम

यह एक एफएक्यू:

आप कई चर परिभाषित कर रहे हैं, प्रत्येक नाम $title और प्रत्येक बेकार है, क्योंकि यह तुरंत दायरे से बाहर हो जाता है।

शर्तों के आधार पर एक चर को परिभाषित करने के XSLT 1.0 में उचित तरीके से है:

<xsl:variable name="vTitle"> 
    <xsl:choose> 
     <xsl:when test='type = 6'> 
     <xsl:value-of select='root/info/title' /> 
     </xsl:when> 
     <xsl:when test='type = 7'> 
     <xsl:value-of select='root/name' /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="'unknown'"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

को परिभाषित करने का एक और तरीका एक ही चर: इस विशेष मामले में आप चर एक स्ट्रिंग करना चाहते हैं मूल्य। यह एक अधिक कॉम्पैक्ट रूप में व्यक्त किया जा सकता है:

<xsl:variable name="vTitle2" select= 
"concat(root/info/title[current()/type=6], 
     root/name[current()/type=7], 
     substring('unknown', 1 div (type > 7 or not(type > 5))) 
     ) 
"/> 

अंत में, XSLT 2.0 एक में ऐसा वैरिएबल भी अधिक आसानी से परिभाषित कर सकते हैं: @ carolclarinet के standar जवाब और अधिक कॉम्पैक्ट इसके अलावा

<xsl:variable name="vTitle3" as="xs:string" select= 
"if(type eq 6) 
    then root/info/title 
    else if(type eq 7) 
      then root/name 
      else 'unknown' 
"/> 
+0

'क्योंकि यह तुरंत दायरे से बाहर हो जाता है।' मुझे संदेह है कि यह मामला है। कौन सा टैग दायरे को परिभाषित करता है, 'xsl: चुनें'? मेरी समस्या यह है कि मैं एक परीक्षण के आधार पर लगभग 50 चर सेट करने की कोशिश करता हूं, और मैं नहीं चाहता कि प्रत्येक चर परीक्षण को दोहराए। मैंने इसे तर्कसंगत रूप से करने की कोशिश की (चुनें, (कब (ए), परिवर्तनीय *), (जब (बी), परिवर्तनीय *)) और इसलिए मैं दायरे से बाहर गया ... क्या एकल का उपयोग करने का कोई तरीका है एकाधिक चर के लिए परीक्षण लेकिन फिर भी उन्हें गुंजाइश में रखें? – n611x007

1

@ डिमिट्रे का जवाब, जब परिणाम कुछ नोड पर निर्भर करता है और आप पुन: उपयोग और विस्तारशीलता के बारे में चिंता करते हैं, तो आप टेम्पलेट्स लागू कर सकते हैं और पैटर्न मिलान का उपयोग कर सकते हैं, यानी:

<xsl:variable name="title"> 
    <xsl:apply-templates select="type" mode="title"/> 
</xsl:variable> 

<xsl:template match="type[.=6]" mode="title"> 
    <xsl:value-of select='../root/info/title"/> 
</xsl:template> 
<xsl:template match="type[.=7]" mode="title"> 
    <xsl:value-of select='../root/name"/> 
</xsl:template> 
<xsl:template match="type" mode="title"> 
    <xsl:text>unknown</xsl:text> 
</xsl:template> 
-1

मैं स्थानीय मान को xml xsl:desult _document फ़ोल्डर /temp_variables_loop/loop-data-id_(position()).xml पर सहेजने के लिए कर रहा हूं।

और अगले लूप में मैंने/temp_variables_loop.alias/loop-data-id_(position()-1).xml से फ़ाइलें पढ़ीं।

आपको /temp_variables_loop से temp_variables_loop.alias के उपनाम बनाकर xsl इंजन को धोखा देने की आवश्यकता है क्योंकि आप एक ही फ़ाइल को एक xsl में पढ़ और लिख नहीं सकते हैं।

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

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