2010-06-01 9 views
5

मैं XPath के लिए नया हूं, और अक्षों के बारे में कुछ ट्यूटोरियल्स में जो मैंने पढ़ा है, उससे मैं अभी भी सोच रहा हूं कि उन्हें कैसे कार्यान्वित किया जाए। जैसा कि मैंने उम्मीद की थी, वे काफी व्यवहार नहीं कर रहे हैं। मैं विशेष रूप से पूर्वजों और वंश अक्षों का उपयोग करने में रूचि रखता हूं।एक्सएसएल प्रतिलिपि में एक्सपीएथ पूर्वजों और वंशज

मैं निम्न XML संरचना है:

<file> 
    <criteria> 
     <root>ROOT</root> 
     <criterion>AAA</criterion> 
     <criterion>BBB</criterion> 
     <criterion>CCC</criterion> 
    </criteria> 
    <format> 
     <sort>BBB</sort> 
    </format> 
</file> 

और मैं निम्नलिखित XSL है:

<xsl:template match="/"> 
    <xsl:copy-of select="ancestor::criterion/> 
</xsl:template> 

जो कुछ भी पैदा करता है!

मैं इसे उत्पादन की उम्मीद:

<file> 
    <criteria> 
    </criteria> 
</file> 

किसी ट्यूटोरियल की तुलना में मैं पहले से पढ़ लिया है एक और अधिक उपयोगी तरह से मेरे लिए पूर्वज और वंशज कुल्हाड़ियों व्याख्या कर सकते हैं?

धन्यवाद!

+0

अच्छा प्रश्न (+1)। एक स्पष्टीकरण और एक पूर्ण समाधान के लिए मेरा जवाब देखें। –

उत्तर

5

और मैं निम्नलिखित XSL है:

<xsl:template match="/"> 
    <xsl:copy-of select="ancestor::criterion/> 
</xsl:template> 

जो कुछ भी पैदा करता है!

जैसा कि यह होना चाहिए!

ancestor::criterion 

एक रिश्तेदार अभिव्यक्ति जिसका अर्थ है कि यह वर्तमान नोड (टेम्पलेट से मिलान) बंद का मूल्यांकन किया जाता है। लेकिन वर्तमान नोड दस्तावेज़ नोड / है।

तो, इसके बाद के संस्करण के बराबर है:

/ancestor::criterion 

हालांकि, परिभाषा के द्वारा दस्तावेज़ नोड / कोई माता-पिता है (और है कि कोई पूर्वजों का मतलब है), तो यह XPath अभिव्यक्ति किसी भी नोड का चयन नहीं करता।

<file> 
    <criteria> 
    </criteria> 
</file> 

क्या आप शायद चाहता था:

मैं इसे उत्पादन की उम्मीद

//criterion/ancestor::* 

या

//*[descendant::criterion] 

पिछले दो xPath अभिव्यक्ति बराबर हैं और चुनते हैं सभी तत्व जिनके पास criterion वंशज है।

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="root | criterion | format"/> 
</xsl:stylesheet> 

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

अंत में, उत्पादन आप चाहते थे, यहाँ का उत्पादन करने के एक संभव समाधान है

<file> <criteria> </criteria> </file> 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद। // मानदंड/पूर्वजों :: * और // * [वंशज :: मानदंड] मुझे अजीब परिणाम देते हैं, और आपके द्वारा प्रदान किए गए पूरी तरह से कोडित समाधान काम करते हैं और अपेक्षित परिणाम उत्पन्न करते हैं, मुझे अभी भी कम हार्ड-कोडेड समाधान की आवश्यकता है (यह उपरोक्त है समाधान के लिए रूट और प्रारूप के ज्ञान की आवश्यकता होती है .. लेकिन ऐसे अन्य लोग भी हो सकते हैं जिनके बारे में मुझे पता नहीं है ..) इसके अलावा, वंश और पूर्वजों के अक्षों के स्पष्टीकरण के लिए धन्यवाद :) – developer

+0

@iHartGreek: आप एक XPath अभिव्यक्ति का चयन क्यों करते हैं अन्य नोड्स का चयन करने के लिए विशिष्ट नोड्स? यदि आपको कोई और समस्या है, तो बस एक और सवाल पूछें। आपने उस प्रश्न से नहीं पूछा है जिसका उत्तर नहीं दिया गया है। :) –

1

ancestor एक्सएमएल दस्तावेज़ में उच्च (रूट के करीब) नोड्स चुनने के लिए है। descendant एक्सएमएल दस्तावेज़ में कम (बच्चों) नोड्स का चयन करने के लिए है।

अपने उदाहरण में, ancestor::criterion कुछ भी नहीं का चयन करता है क्योंकि वर्तमान नोड / (दस्तावेज़ की जड़ अर्थ - इस मामले में <file>) है, के रूप में match="/" ने संकेत दिया। रूट नोड में कोई पूर्वजों नहीं है इसलिए ancestor अक्ष कुछ भी नहीं करता है।

<xsl:template match="/"> 
    <xsl:copy-of select="descendant::criterion"/> 
</xsl:template> 

या अपने शॉर्टकट //:

हर <criterion> तत्व पाने के लिए आपको descendant अक्ष का उपयोग करना चाहिए का उपयोग करना

<criterion>AAA</criterion> 

:

<xsl:template match="/"> 
    <xsl:copy-of select="//criterion"/> 
</xsl:template> 

निम्नलिखित वापस आ जाएगी कि एक लूप या एक और टेम्पलेट आप तीनों को प्राप्त कर सकते हैं उन्हें: भी, यह थोड़ा और अधिक जटिल है

<file> 
    <criterion>AAA</criterion> 
    <criterion>BBB</criterion> 
    <criterion>CCC</criterion> 
</file> 

आप <file> तत्व प्राप्त करना चाहते हैं,:

<xsl:template match="/"> 
    <file> 
    <xsl:apply-templates select="//criterion"/> 
    </file> 
</xsl:template> 
<xsl:template match="criterion"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

यह निम्न का उत्पादन करेगा। XPath नोड्स निर्दिष्ट करता है और सरल प्रतियां उन तत्वों की प्रतिलिपि नहीं रखती हैं जिनमें आपके द्वारा चुने गए तत्व होते हैं। यदि आप अभी भी उलझन में हैं तो मैं इस बिंदु को और अधिक स्पष्ट कर सकता हूं।

+0

आप कहते हैं कि: ' ' निम्नलिखित वापस आ जाएगी: ' एएए' ऐसा नहीं है। परिणाम होंगे: ' एएए बीबीबी सीसीसी' –

+0

बस एक बिंदु है, लेकिन 'वंशज :: criterion'' // criterion' के बराबर नहीं है; उत्तरार्द्ध पूरे दस्तावेज़ में सभी मानदंड नोड्स मिलेगा। सही शॉर्टकट '.// मानदंड' है। – Flynn1179

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