2012-06-11 7 views
13

मैं निम्न XML दिया गया था:XML तत्व नाम स्थान है, मेरे XPATH काम नहीं करता है

<root> 
    <items> 
    <item> 
     <title>Item</title> 
     <details> 
     <data xmlns="http://some_url"> 
      <length>10</length> 
      <weight>1.2</weight> 
     </data> 
     </details> 
    </item> 
    </items> 
</root> 

कुछ भी नहीं है जिसका अर्थ है काम नहीं करता है "डाटा" तत्व की तरह छपा है XPath के बाद नहीं मौजूद है:

/root/items/item/details/data 

लेकिन जब मैं "डेटा" तत्व के "xmlns" नेमस्पेस विशेषता को हटा देता हूं तो इसकी सामग्री मुद्रित होती है। xpath अभिव्यक्ति को "डेटा" तत्व के "xmlns" नेमस्पेस विशेषता को हटाने के बिना कैसे काम करना चाहिए?

मैं सैक्सन और एक्सएसएल 1.0 का उपयोग कर रहा हूं।

+0

आपको अपने XPath e के साथ नेमस्पेस पंजीकृत करने की आवश्यकता है ngine, फिर अपने XPath में पंजीकृत उपनाम का उपयोग करें: 'उपनाम: डेटा/उपनाम: लंबाई'। हम XPath का मूल्यांकन करने के लिए आप क्या उपयोग कर रहे हैं यह जानने के बिना उससे अधिक विशिष्ट नहीं हो सकते हैं। –

उत्तर

13

इस में से एक है XPath/XSLT में सबसे अधिक पूछे जाने वाले प्रश्न:

XPath "कोई नाम स्थान" करने के लिए संबंधित के रूप में एक बिना उपसर्ग वाले तत्व नाम व्याख्या करती है और यह डिफॉल्ट (अरिक्त) नाम स्थान से संबंधित बिना उपसर्ग वाले नामों के साथ कारण तत्वों का चयन नहीं कर रहे हैं जब केवल अपने अपरिवर्तित नाम को XPath अभिव्यक्ति में नोड-परीक्षण के रूप में निर्दिष्ट किया गया है।

समाधान या तो है:

  1. एक namespace बाध्यकारी जहां एक उपसर्ग (जैसे कि "x") डिफ़ॉल्ट नाम स्थान से संबंधित है जो बनाएं, फिर x:elementName बजाय elementName निर्दिष्ट करें। जैसे

  2. उपयोग, लंबे समय से बदसूरत और अविश्वसनीय भाव: *[name() = 'elementName']

यहाँ ऊपर Method1 का उपयोग कर एक XSLT परिवर्तन है। :

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

<xsl:template match="/"> 
    <xsl:value-of select= 
    "/root/items/item/details/a:data/a:weight"/> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव प्रदान की XML दस्तावेज़ पर (सैक्सन 6.5.4 या किसी अन्य अनुरूप XSLT 1.0 प्रोसेसर का उपयोग) लागू किया जाता है:

<root> 
    <items> 
     <item> 
      <title>Item</title> 
      <details> 
       <data xmlns="http://some_url"> 
        <length>10</length> 
        <weight>1.2</weight> 
       </data> 
      </details> 
     </item> 
    </items> 
</root> 

सही/चाहता था नोड चयन किया जाता है और इसके स्ट्रिंग मान को आउटपुट:

1.2 
0

XPath में, आपको नामस्थान में उपसर्ग असाइन करना होगा। इस प्रकार आप कैसे करना है कि आप प्रयोग कर रहे हैं, लेकिन आप नामस्थान उपसर्ग someUrl साथ नाम स्थान यूआरआई http://some_url सहयोगी मानते हुए XPath सॉफ्टवेयर/पुस्तकालय पर निर्भर करता है, तो आप अपने XPath अभिव्यक्ति बदल सकते हैं:

/root/items/item/details/someUrl:data 
+0

उत्तर के लिए धन्यवाद। मैं सैक्सन और एक्सएसएल 1.0 का उपयोग कर रहा हूं। मैंने xpath "/ root/items/item/details/a: data" से पूछने की कोशिश की और यह "डेटा" तत्व की सभी सामग्री मुद्रित की। जब मैंने पूछताछ की "/ root/items/item/details/a: data/a: weight" मुझे "1.2" मुद्रित होने की उम्मीद है लेकिन यह फिर से "डेटा" तत्व की सभी सामग्री मुद्रित करता है। क्या आप कृपया सलाह दे सकते हैं कि मैं क्या गलत कर रहा हूं? – Vojtech

+0

जब आप एक्सएसएल का उपयोग कर रहे हैं, तो क्या आप अपनी पूरी एक्सएसएल स्टाइलशीट दिखा सकते हैं? (या कम से कम एक छोटा संस्करण जो उचित रूप से पूरा है?) –

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