2009-03-11 9 views
5

मैं एक्सएसएलटी चर का उपयोग करने की कोशिश कर रहा हूं और अधिक सफलता नहीं ले रहा हूं, उम्मीद है कि मैं बस कुछ गूंगा कर रहा हूं।मेरे एक्सएसएलटी चर उनके मूल्यों को प्रतिस्थापित क्यों नहीं कर रहे हैं?

मैं निम्नलिखित कोड का टुकड़ा है:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xalan="http://xml.apache.org/xslt" 
    version="1.0"> 

    <xsl:template match="/"> 
     <xsl:variable name="config" select="query/@config"></xsl:variable> 

तो मैं वहाँ उम्मीद एक चर 'config' होने का मेरे उच्च-स्तर तत्व 'जिज्ञासा' की 'config' विशेषता के मान पर निर्धारित किया है।

मैं तो चर उदाहरण के लिए, मेरी स्टाइलशीट में बाद में उपयोग करने का प्रयास:

<a href="localhost/test?go"> 
    {$config} 
</a> 

लेकिन उत्पादन मैं अपने उत्पादन HTML दस्तावेज़ में देखते हैं:

<a href="localhost/test?go"> 
    {$config} 
</a> 

इतना मूल्य नहीं है जैसा कि मैंने उम्मीद की थी, प्रतिस्थापित किया गया था।

मुझे लगता है कि यह बहुत आसान मामला हो सकता है, इसलिए मैं बेवकूफ काम कर रहा हूं! कृपया मदद करें, धन्यवाद!


सब जो प्रतिक्रिया व्यक्त करने के लिए अद्यतन धन्यवाद, मैं क्या मैं एक विशेषता या बाहर में काम कर रहा था की विभिन्न संदर्भों को गलत समझा। मेरी समस्या को अच्छी तरह से हल किया!

यदि मैं दो जवाब स्वीकार कर सकता हूं, मेरे पास है, और @Aaron Digulla's, जो गुणों की विशेषता को समझाता है।

उत्तर

12

अपने स्टाइलशीट में आप का उपयोग करना चाहिए:

<xsl:value-of select="$config"/> 

के बजाय:

{$config} 
3

{$config} के बजाय <xsl:value-of select="$config"/> का उपयोग करें।

+0

मुझे यह करने के लिए मारो;) – Kezzer

+0

@Kezzer: इसलिए वे मेरे बड़े रुपये का भुगतान <('_' <) – Welbog

0

क्योंकि आपको <xsl:value-of select="config"/> का उपयोग करने की आवश्यकता है?

+3

तो config एक चर रहा है, हम $ config का उपयोग करना चाहिए, नहीं? – bortzmeyer

6

{$config} केवल XSLT तत्वों की विशेषताओं में काम करता है। (नोट: ब्रेस के अंदर डॉलर क्योंकि पूर्ण XPath अभिव्यक्ति को ब्रेसिज़ से घिरा होना चाहिए)

+0

उद्घाटन ब्रेस के सामने $ क्यों होना चाहिए? कभी नहीं देखा –

+0

@ डिवो: क्योंकि यह वाक्यविन्यास है। – Welbog

+0

नहीं, यह नहीं है;) http://www.w3.org/TR/xslt#attribute-value-templates देखें: –

12

यहां दो प्रश्न हैं जो समान प्रतीत होते हैं, लेकिन जो कि अलग-अलग हैं: 1) कैसे क्या मैं नाम से एक चर का संदर्भ देता हूं ? 2) कहां क्या मैं नाम से एक चर का संदर्भ दे सकता हूं?

सबसे पहले, $varname वाक्यविन्यास का उपयोग करके चर हमेशा संदर्भित किया जाता है। दूसरा, यह किया जा सकता है कहीं भी एक अभिव्यक्ति की अनुमति है। यह दूसरा हिस्सा है जो उलझन में प्रतीत होता है। शुरू में, एक तत्व या विशेषता के मान डिफ़ॉल्ट रूप से उत्पादन का शाब्दिक है, इसलिए कोई भी वेरिएबल वास्तव में निम्न उदाहरण में संदर्भित:

<element attr="$test">$test or {$test}</element> 

उत्पादन सचमुच मेल खाएगा टाइप किया गया था।

एक चर के मूल्य को आउटपुट करने के लिए, हमें इसका संदर्भ देने की आवश्यकता है जहां अभिव्यक्ति की अनुमति है। तत्व सामग्री में, हम xsl:value-of का उपयोग करते हैं; उन गुणों में जिन्हें Attribute Value Template (उदा।एक शाब्दिक परिणाम तत्व के गुण), अभिव्यक्ति घुंघराले ब्रेसिज़ {} द्वारा सीमित हैं।

<xsl:variable name="test" select="'value'"/> 

... उसके बाद निम्न:

<element attr="{$test}"><xsl:value-of select="$test"/></element> 

... में परिणाम:

<element attr="value">value</element> 

कुछ विदाई एवीटीएस पर और value-of नोट:

निम्नलिखित घोषणा मान लें
  • दोनों मामलों में चर संदर्भ था $test के रूप में ced। एवीटी में ब्रेसिज़ चरणीय संदर्भ का हिस्सा नहीं हैं; वे अभिव्यक्ति delimiters हैं।
  • किसी भी मामले में, अभिव्यक्ति में एक चर के संदर्भ में शामिल नहीं होना चाहिए; किसी भी XPath अभिव्यक्ति की अनुमति दी गई होगी।
  • एक्सएसएलटी दस्तावेज़ में सभी विशेषताओं को विशेषता मान टेम्पलेट्स के रूप में नहीं माना जाता है। उदाहरण के लिए, ध्यान दें कि xsl:value की select विशेषता पहले से ही अभिव्यक्ति सामग्री के रूप में स्वीकार करती है।
  • प्रश्न: आप इस तरह की विशेषता में value-of का उपयोग क्यों नहीं कर सकते?

    <element attr="<xsl:value-of select="$test"/>"/> 
    

    उत्तर: क्योंकि XSLT दस्तावेज अच्छी तरह से गठित XML शामिल होना चाहिए (और है कि नहीं है)।

  • प्रश्न: आप सामग्री सामग्री में {$varname} का उपयोग क्यों नहीं कर सकते?

    ग्लिब उत्तर: क्योंकि एक्सएसएलटी के रचनाकारों ने इसे इस तरह से डिजाइन नहीं किया है।

+0

मैंने जो जवाब जोड़ा है उसे देखें: आपके उत्तर में अंतिम प्रश्न/उत्तर। सुनिश्चित नहीं है कि आपने इसे अभी तक देखा है (क्योंकि आपका उत्तर इतना पुराना है)। –

+0

अलग-अलग स्थानों में चर संदर्भ देने के लिए विभिन्न वाक्यविन्यासों को स्पष्ट रूप से समझाते हुए धन्यवाद। {} वाक्यविन्यास पर स्पष्टीकरण की खोज करते समय मुझे यह मिला। धन्यवाद! – levininja

1

@ lwburk का जवाब बहुत अच्छा है (+1), लेकिन पिछले प्रश्न/उत्तर XSLT 1.0 और 2.0 के लिए ही सटीक है। 3.0 में आप एक टीवीटी (Text Value Template; एवीटी (विशेषता मूल्य टेम्पलेट) के समान @ lwburk के उत्तर में उल्लिखित) का उपयोग कर सकते हैं।

टीवीटी का उपयोग करने के लिए, तत्व में मानक विशेषता xsl:expand-text="yes" जोड़ें। इससे प्रोसेसर टीवी तत्व के रूप में उस तत्व के वंशज टेक्स्ट नोड्स का इलाज करेगा।

उदाहरण:

XSLT 3,0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <xsl:variable name="who" select="'Dan'"/> 
     <xsl:variable name="what" select="'BAM!'"/> 
     <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result> 
    </xsl:template> 

</xsl:stylesheet> 

आउटपुट (इनपुट के रूप में किसी भी अच्छी तरह से गठित XML का उपयोग)

<result>This is Dan's result: BAM!</result> 

नोट: का उपयोग कर परीक्षण किया गया सैक्सन-PE 9.5 ।

+0

+1 एक्सएसएलटी 3.0 उत्तर जोड़ने के लिए धन्यवाद। –