2010-05-20 12 views
10

मैं XPATH का उपयोग कर XML दस्तावेज़ के लिए केवल विशिष्ट तत्वों का चयन कैसे कर सकता हूं? मैंने 'विशिष्ट-मूल्य' फ़ंक्शन का उपयोग करने का प्रयास किया है लेकिन यह किसी कारण से काम नहीं करता है ..XPATH का उपयोग कर XML दस्तावेज़ से अलग-अलग मानों का चयन कैसे करें?

एक्सएमएल समान है निम्नलिखित:

<catalog> 

<product> 
<size>12</size> 
<price>1000</price> 
<rating>1</rating> 
</product> 

<product> 
<size>10</size> 
<price>1000</price> 
<rating>1</rating> 
<year>2010</year> 
</product> 

</catalog> 

तो क्या मैं प्राप्त करना चाहते है सब उत्पाद elements.In दिए गए उदाहरण यह होगा की विशिष्ट बच्चों की सूची - आकार, कीमत, रेटिंग, साल मेरे xpath था की तरह कुछ: अलग -वृत्त (सूची/उत्पाद/*)

+0

विशिष्ट मूल्यों के लिए केवल एक मान के लिए उपयोग किया जाता है और इनलाइन सामग्री या विशेषता सामग्री के लिए उपयोग किया जाता है। अलग-अलग बच्चों द्वारा आपका क्या मतलब है? क्या यह आकार, मूल्य, रेटिंग, मूल्यों जैसे अलग तत्व नाम हैं? – Myra

+0

क्षमा करें..हाँ, बिल्कुल.मैं सभी अलग-अलग बच्चों के तत्वों की सूची प्राप्त करना चाहता हूं – Alex

+0

आप XPath द्वारा अलग-अलग नाम नहीं ले सकते हैं! – Myra

उत्तर

14

XPath 2.0 में:

distinct-values(/*/*/*/name(.)) 

XPath 1.0 में यह एक एकल XPath अभिव्यक्ति के साथ उत्पादन नहीं किया जा सकता

XSLT 1.0 का उपयोग करना:

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

<xsl:template match="/"> 
    <xsl:for-each select= 
    "/*/*/*[not(../following::*/* 
         [not(name() = name(current()))] 
       ) 
      ]"> 
    <xsl:value-of select="concat(name(), ' ')"/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव प्रदान की XML दस्तावेज़ पर लागू किया जाता है, वांछित परिणाम का उत्पादन किया है:

size price rating year 

एक अधिक कुशल XSLT 1.0 परिवर्तन , चाबियाँ:

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

<xsl:key name="kpchildByName" 
    match="product/*" use="name()"/> 

<xsl:template match="/"> 
    <xsl:for-each select= 
    "/*/*/* 
     [generate-id() 
     = 
      generate-id(key('kpchildByName', name())[1]) 
      ]"> 
    <xsl:value-of select="concat(name(), ' ')"/> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
3

distinct-values() XPath 2 में उपलब्ध है .0। क्या आप इसका इस्तेमाल कर रहे हैं?

यदि distinct-values() उपलब्ध नहीं है, तो विशिष्ट मान प्राप्त करने का मानक तरीका अद्वितीय @result प्राप्त करने के लिए not(@result = preceding:: @result) का उपयोग करना है। यह आपको केवल पहली घटना देगा।

+1

मुझे यकीन नहीं है कि मुझे कौन सा XPATH संस्करण मिला है :) मैं इसके बारे में कैसे पता लगा सकता हूं? – Alex

+0

यह केवल तभी काम करेगा जब सूची आपके परिणाम पर क्रमबद्ध हो – Hazaart

2

आप तत्व नामों में से अलग-अलग मान की जरूरत है - की तरह कुछ:

distinct-values($catalog/product/*/name(.)) 
संबंधित मुद्दे