2010-09-02 19 views
18

में एक नक्शा बनाना चाहते हैं, मैं xsl में एक महत्वपूर्ण मूल्य मानचित्र रखना चाहता हूं और इसलिए एक चर परिभाषित किया गया है जिसमें xml खंड है, लेकिन बाद में जब मैं चर में xml नोड्स तक पहुंचने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है xpath xpression का हल नहीं किया जा सकता है।एक्सएसएलटी: एक्सएसएलटी

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <xsl:variable name="map"> 
      <map> 
       <entry key="key-1">value1</entry> 
       <entry key="key-2">value2</entry> 
       <entry key="key-3">value3</entry> 
      </map> 
     </xsl:variable> 
     <output> 
      <xsl:value-of select="$map/entry[@key='key-1']"/> 
     </output> 
    </xsl:template> 
</xsl:stylesheet> 
+1

इसमें गलत वर्तनी वहाँ पर जा रहा का एक सा है, अपने दस्तावेज़ में भी है जो:

तो, अपने XSLT प्रोसेसर 3.0 और नक्शे (जैसे सैक्सन 9.4) का समर्थन करता है, तो आपको निम्न कोड का उपयोग कर सकते हैं? यह है जिसे पढ़ना चाहिए। – Rob

उत्तर

33

XSLT 2.0

XSLT 2.0 का उपयोग करना, निम्नलिखित समाधान काम करता है:

<xsl:variable name="map"> 
    <entry key="key-1">value1</entry> 
    <entry key="key-2">value2</entry> 
    <entry key="key-3">value3</entry> 
    </xsl:variable> 

    <xsl:template match="/"> 
    <output> 
     <xsl:value-of select="$map/entry[@key='key-1']"/> 
    </output> 
    </xsl:template> 

XSLT 1.0

आप XSLT 1.0 में एक XPath अभिव्यक्ति में एक परिणाम के पेड़ टुकड़ा उपयोग नहीं कर सकते, लेकिन fn:document() मानचित्र मान पुनर्प्राप्त कर सकते हैं। similar question का उत्तर यहां काम करेगा:।

<xsl:value-of select="document('')//xsl:variable[@name='map']/map/entry[@key='key-1']"/> 

में वर्णित है XSLT 1.0 specification:

document('') स्टाइलशीट की जड़ नोड के लिए संदर्भित करता है; पेड़ स्टाइलशीट का प्रतिनिधित्व बिल्कुल वैसा ही है जैसे कि XML स्टाइलशीट वाला दस्तावेज़ प्रारंभिक स्रोत दस्तावेज़ था।

हालांकि, आपको इसके लिए xsl:variable का उपयोग करने की आवश्यकता नहीं है। आप सीधे xsl:stylesheet के तहत अपने मानचित्र नोड निर्दिष्ट कर सकते हैं, लेकिन आप याद रखना चाहिए कि एक शीर्ष स्तर तत्व एक गैर अशक्त नाम स्थान होना आवश्यक है यूआरआई:

<xsl:stylesheet 
    version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:my="some.uri" exclude-result-prefixes="my"> 

    <my:map> 
    <entry key="key-1">value1</entry> 
    <entry key="key-2">value2</entry> 
    <entry key="key-3">value3</entry> 
    </my:map> 

    <xsl:template match="/"> 
    <output> 
     <xsl:value-of select="document('')/*/my:map/entry[@key='key-1']"/> 
    </output> 
    </xsl:template> 
</xsl:stylesheet> 
+0

हाय, लेकिन फिर जब मैंने परिणाम पेड़ खंड की प्रतिलिपि बनाई थी तो ठीक से मुद्रित किया गया था और न केवल परिणाम-पेड़ में केवल पाठ नोड्स को मुद्रित किया गया था। बीआर, केशव – keshav84

+0

@ केशव: यदि आप नोड सेट के रूप में उपयोग करने की कोशिश किए बिना परिवर्तनीय '$ map' पर केवल 'प्रतिलिपि' /' मान-का उपयोग करते हैं, तो यह काम करेगा। लेकिन एक बार जब आप XPath अभिव्यक्ति के साथ परिणाम पेड़ खंड को कम करने का प्रयास करते हैं तो यह असफल हो जाएगा। –

+0

यह * लगभग * है जो मुझे अपनी विशेष समस्या के लिए चाहिए। यदि मैं मानचित्र में सही प्रविष्टि को देखने के लिए हार्ड-वायर्ड कुंजी -1 के बजाय xpath या $ पैरामीटर का उपयोग करना चाहता हूं तो क्या होगा? मैंने की कोशिश की है लेकिन यह काम नहीं करता है। – gilles27

5

आप XSLT 1.0 के रूप में चर की सामग्री को प्रयोग करने के लिए समर्थन लापता चारों ओर काम की सॉर्ट कर सकते हैं एक नोड सेट। आपको पार्सर के निर्माता द्वारा जोड़े गए एक्सटेंशन पर भरोसा करना होगा। उदाहरण के लिए, माइक्रोसॉफ्ट इससे बचने के लिए एक समारोह का प्रस्ताव दिया है: नोड सेट()

आपका XSL इस तरह दिखेगा:

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
    <xsl:template match="/"> 
     <xsl:variable name="map"> 
      <map> 
       <entry key="key-1">value1</entry> 
       <entry key="key-2">value2</entry> 
       <entry key="key-3">value3</entry> 
      </map> 
     </xsl:variable> 
     <output> 
      <xsl:value-of select="msxsl:node-set($map)/map/entry[@key='key-1']"/> 
     </output> 
    </xsl:template> 
</xsl:stylesheet> 

सूचना नाम स्थान और msxsl-उपसर्ग यहाँ। यह केवल माइक्रोसॉफ्ट के पार्सर के आधार पर अनुप्रयोगों में काम करेगा (उदाहरण के लिए: इंटरनेट एक्सप्लोरर इसका उपयोग करता है, साथ ही .NET)। अन्य पार्सर्स में ऐसा एक्सटेंशन हो सकता है या नहीं हो सकता है (उदाहरण के लिए, सैक्सक्सन करता है, लेकिन इसका नाम थोड़ा अलग है)। लेकिन, यह एक्सएसएलटी 2.0 के आधार पर समाप्त हो जाता है, क्योंकि यह एक्सएसएलटी 1.0 में ठीक काम करेगा और माइक्रोसॉफ्ट ने अभी तक एक्सएमएलटी 2.0 को अपने एक्सएमएल लाइब्रेरी में समर्थन नहीं दिया है (जब तक कि उन्होंने इसे हाल ही में जोड़ा नहीं है)।

आपके द्वारा उपयोग किए जा रहे पार्सर के आधार पर, उपर्युक्त आपके लिए ठीक काम कर सकता है, अन्यथा प्रति टी का उत्तर आपके लिए बेहतर है।

+0

+1 मेरे उत्तर में अच्छा जोड़ा। आम तौर पर मैं विक्रेता विशिष्ट एक्सटेंशन से बचने की कोशिश करता हूं, लेकिन यह निश्चित रूप से इसे हल करने का एक तरीका है! –

+1

@ Per_T का उत्तर सभी मामलों में बेहतर है, क्योंकि यह एक पूरी तरह से * पोर्टेबल * समाधान है। यहां ऐसी समस्याएं हैं जिन्हें 'xxx: node-set()' एक्सटेंशन के बिना हल करना बहुत मुश्किल है, लेकिन वर्तमान समस्या इनमें से एक नहीं है। साथ ही, 'xxx: node-set()' समाधान की वकालत करने में हमेशा एक 'exslt: node-set()' का संदर्भ लेना चाहिए, जो काफी पोर्टेबल है क्योंकि कई विक्रेता EXSLT कार्यान्वयन प्रदान करते हैं। –

+0

@ डिमिट्रे मुझे स्वीकार करना होगा कि टी टी के जवाब ने मुझे एक्सएसएल के बारे में कुछ चीजें सिखाई हैं जो मुझे नहीं पता था (मैं एक विशेषज्ञ नहीं हूं), इसलिए मुझे बहुत अच्छा पता नहीं था और मैंने निश्चित रूप से महान होने के लिए अपना जवाब उड़ाया। ;) मैं थोड़ा तर्क देता हूं कि, पोर्टेबिलिटी एक बहुत अच्छी बात है, इसका महत्व संदर्भ निर्भर है इसलिए मैं अपने उत्तर को बहुत भयानक नहीं मानना ​​चाहूंगा: यह ठीक हो सकता है। ;) यह वास्तव में आपके एक्सएसएल को प्रदूषित नहीं करता है क्योंकि यह बहुत आक्रामक नहीं है। यही कारण है कि हम इस समाधान के बारे में खुश हैं, भले ही मैं आपसे सहमत हूं कि यह सही नहीं है। :) आपके सहयोग के लिए धन्यवाद! – Rob

3

एक्सएसएलटी 3.0 वर्किंग ड्राफ्ट में, एक नए प्रकार के XPath आइटम (मानचित्र) का प्रस्ताव है, maps in XSLT 3.0 WD Spec देखें।

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="3.0"> 
    <xsl:output indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:variable name="map" select=" 
     map { 
     'key-1' := 'value1', 
     'key-2' := 'value2', 
     'key-3' := 'value3' }">  
    </xsl:variable> 
    <output> 
     <xsl:value-of select=" 
     $map('key-1') || ', ' || $map('key-2') || ', ' || $map('key-3')"/> 
    </output> 
    </xsl:template> 
</xsl:stylesheet>