xpath

2012-06-30 17 views
7

का उपयोग कर पैरेंट नोड की स्थिति खोजें xpath का उपयोग कर पूर्ण दस्तावेज़ में पैरेंट नोड की स्थिति कैसे प्राप्त करें?xpath

कहते हैं कि मैं निम्नलिखित xml है:

<catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

और मैं एक XSLT यह HTML में परिवर्तित करने के लिए है, जो इस प्रकार है (केवल झलकी) है:

<xsl:template match="/"> 
<html> 
    <body> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="cd"> 
    <p> 
    <xsl:number format="1. "/><br/> 
    <xsl:apply-templates select="title"/> 
    <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

<xsl:template match="title"> 
    <xsl:number format="1" select="????" /><br/> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

मैं क्या लिखना चाहिए की जगह ???? दस्तावेज़ में पैरेंट सीडी टैग की स्थिति प्राप्त करने के लिए। मैंने कई अभिव्यक्तियों की कोशिश की है लेकिन कुछ भी काम नहीं कर रहा है। हो सकता है कि मैं इसे पूरी तरह से गलत कर रहा हूं।

  1. <xsl:number format="1" select="catalog/cd/preceding-sibling::..[position()]" />
  2. <xsl:number format="1" select="./parent::..[position()]" /><br/>
  3. <xsl:value-of select="count(cd/preceding-sibling::*)+1" /><br/>

मैं चयन वर्तमान नोड के माता-पिता धुरी के रूप में 2 की व्याख्या कर रहा हूँ और उसके बाद वर्तमान नोड के माता-पिता की स्थिति को बताओ। यह क्यों काम नहीं कर रहा है? ऐसा करने का सही तरीका क्या है।

FYI: मुझे उम्मीद है कि कोड वर्तमान शीर्षक टैग uder प्रसंस्करण के मूल सीडी टैग की स्थिति मुद्रित करेगा।

कृपया कोई मुझे बता सकता है कि यह कैसे करें।

उत्तर

16
count(../preceding-sibling::cd) + 1 

आप run it here (ध्यान दें मैं दूसरे नंबर पर आप outputting रहे थे, बस स्पष्टता के लिए निकाला गया) कर सकते हैं।

आप सही लाइनों पर थे, लेकिन याद रखें कि पूर्वानुमान केवल नोड फ़िल्टर करने के लिए उपयोग किए जाते हैं, सूचना वापस नहीं करने के लिए। तो:

../*[position()] 

... प्रभावी रूप से कहता है "मुझे ऐसे माता-पिता को ढूंढें जिनके पास स्थिति है"। यह नोड लौटाता है, स्थिति ही नहीं। भविष्यवाणी सिर्फ एक फिल्टर है।

किसी भी मामले में वहाँ position() उपयोग करने के साथ नुकसान कर रहे हैं, और यह वर्तमान संदर्भ नोड की स्थिति केवल वापस जाने के लिए इस्तेमाल किया जा सकता - नहीं एक और नोड।

+0

धन्यवाद एक टन आदमी, अब यह मेरे की मूर्खतापूर्ण था कि कोशिश करने के लिए नहीं। धन्यवाद फिर से :) – Harshdeep

+0

आप "स्थिति()" के लिए किए गए "गिनती (../ preceding-sibling :: cd) + 1" अभिव्यक्ति की व्याख्या कर सकते हैं। मैंने आपके समाधान का उपयोग किया और यह बहुत अच्छा काम करता है लेकिन मुझे समझ में नहीं आता है कि क्यों नहीं "गिनती (सीडी/पूर्ववर्ती-भाई :: ..) + 1" – Harshdeep

+2

याद रखें एक्सएसएलटी टेम्पलेट्स वर्तमान संदर्भ नोड के परिप्रेक्ष्य से संचालित होते हैं। संबंधित टेम्पलेट में, संदर्भ नोड शीर्षक है। इसलिए, 'गिनती (सीडी ...)' को कोई नोड नहीं मिलेगा क्योंकि 'cd' नामक 'शीर्षक' के कोई भी बच्चे नोड्स नहीं हैं (वास्तव में, 'शीर्षक' में किसी भी नाम का कोई बच्चा नोड नहीं है)। 'सीडी' 'शीर्षक' का अभिभावक है, न कि उसके बच्चे, इसलिए हमें एक स्तर जाना है। – Utkanos

1
<xsl:number format="1" select="????" /> 

मैं के स्थान पर क्या लिखना चाहिए ???? दस्तावेज़ में पैरेंट सीडी टैग की स्थिति प्राप्त करने के लिए।

सबसे पहले, ऊपर XSLT अनुदेश वाक्य रचना अवैध है - <xsl:number> अनुदेश नहीं (नहीं कर सकते हैं) करता है एक select विशेषता है।

उपयोग:

<xsl:number format="1" count="cd" /> 
+0

तो यह xsl: संख्या का उपयोग करके भी किया जा सकता है। जानकारी के लिए धन्यवाद। क्या आप इस बारे में कुछ और जानकारी दे सकते हैं कि यह कैसे काम करता है। – Harshdeep

+0

@ हर्षदीप: आप लिंक पर क्लिक करके "यह कैसे काम करता है" सीख सकते हैं (हां, उत्तर में '' का नीला रंग का अर्थ है कि यह एक क्लिक करने योग्य लिंक है)। इस निर्देश का उपयोग करने के परिणाम देखने के लिए, इसे अपने कोड में कॉपी और पेस्ट करें। –

+0

मैंने आपको पूछने से पहले लिंक पर क्लिक किया था लेकिन डब्ल्यू 3 दस्तावेज इतना भारी है कि मुझे इसे 'पठनीय' नहीं मिला है। लेकिन बेहतर समझने के लिए अब इसे देखेंगे। – Harshdeep

3

Utkanos का जवाब ठीक काम करता है लेकिन मेरे अनुभव है कि, जब xml दस्तावेज़ बड़ी है, इस प्रदर्शन के मुद्दों को जन्म दे सकता है।

इस परिदृश्य में आप केवल माता-पिता की स्थिति को एक परम में पारित कर सकते हैं।

<xsl:template match="/"> 
<html> 
    <body> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="cd"> 
    <p> 
    <xsl:number format="1. "/><br/> 
    <xsl:apply-templates select="title"> 
     <xsl:with-param name="parent_position" select="position()"/> <!-- Send here --> 
    </xsl:apply-templates> 
    <xsl:apply-templates select="artist"/> 
    </p> 
</xsl:template> 

<xsl:template match="title"> 
    <xsl:param name="parent_position"/> <!-- Receive here --> 
    <xsl:number format="1" select="$parent_position"/><br/> 
    Title: <span style="color:#ff0000"> 
    <xsl:value-of select="."/></span> 
    <br /> 
</xsl:template> 

परिणाम:

<html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><body> 
    <p>1. <br>1<br> 
    Title: <span style="color:#ff0000">Empire Burlesque</span><br>Bob Dylan</p> 
    <p>2. <br>1<br> 
    Title: <span style="color:#ff0000">Hide your heart</span><br>Bonnie Tyler</p> 
</body></html>