2011-11-08 22 views
5

मान लें कि हम इस सरल एक्सएमएल है का उपयोग कर प्राप्त करें ...XSLT में पहला बच्चा नोड स्थानीय नाम()

<books> 
    <book> 
     <author/> 
     <title/> 
    </book> 
    <book> 
     <author/> 
     <title/> 
    </book> 
</books> 

मैं इस xpath उपयोग कर रहा हूँ पहली पुस्तक उदाहरण के तत्वों मिलता है।

//books[1]/* 

रिटर्न

<author/> 
<title/> 

और वह ठीक काम करता है, लेकिन मैं इसे स्थानीय नाम का उपयोग कर काम कर पाने के लिए है()। मैं निम्नलिखित को आज़मा चुके लेकिन इन में से कोई भी काम ...

//*[local-name()='books']/* 

इस रिटर्न लेखक और शीर्षक तत्वों को दोहरा, अच्छा नहीं, मैं सिर्फ उन्हें पहले बच्चे

//*[local-name()='books'][0]/* 

से की जरूरत नहीं है इस कुछ भी

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

author,title 
john,The End is Near 
sally,Looking for Answers 
+2

आपकी क्वेरी '// पुस्तकों [1]/*' दो पुस्तक तत्वों, नहीं एक लेखक और एक शीर्षक तत्व लौटना चाहिए। तो कहीं कुछ भ्रम है। –

+0

नहीं, यह मेरी Xalan 1.0 XSLT ट्रांसफार्मर के साथ सिर्फ पहले एक रिटर्न – raffian

+0

हाँ, यह ओपी में मेरा बुरा था, मैं, उपयोग कर रहा हूँ [1] आधारित जानकारी – user646584

उत्तर

9

पथ अभिव्यक्ति आप कहते हैं कि तुम

//books[1]/* 

के लिए काम करता है किसी भी < किताबें > नोड की पहली (और केवल इस मामले में) घटना के सभी बच्चे नोड्स की एक सूची उत्पन्न करता है। क्योंकि, आपके डेटा में, < किताबें > का ही घटना जड़ में है, यह के रूप में

/books/* 

जो दो < पुस्तक > नोड्स देता ही है, और इसलिए आप कहना है कि यह केवल एक रिटर्न गलत हैं नोड।

यह जानना है कि तुम क्या जरूरत है, के रूप में यदि आप हमेशा रूट नोड के लिए local-name आवेदन कर रहे हैं तो आप इसके नाम पता करने की जरूरत नहीं है और सिर्फ /* के साथ उपयोग कर सकते हैं मुश्किल है, इसलिए आप बस

/*/*[1] 
चाहेगा

हालांकि एक < किताबें > नोड दस्तावेज में कहीं का पहला बच्चा नोड आप

//*[local-name()='books']/*[1] 

लिखते थे उपयोग करने के लिए आप पी के रूप में अपने संदर्भ सीमित करने के लिए के रूप में ज्यादा सावधान रहना चाहिए ossible, // साथ XPath अभिव्यक्ति शुरू करने जो व्यर्थ और समय लेने है सवाल में नोड जड़ में हमेशा होता है, तो पूरे दस्तावेज, की एक खोज के लिए बाध्य करेगा के रूप में।

+0

अतिरिक्त विवरणों की कमी के लिए खेद है, जो मैं पूरा करने की कोशिश कर रहा हूं, उसके बारे में अधिक जानकारी के लिए int मूल पोस्ट के ऊपर मेरे संपादन देखें। मैंने/*/* [1] का उपयोग करने की कोशिश की, यह दो बार प्रिंटिंग "लेखक, शीर्षक" है, मुझे बस इसे प्रिंट करने की आवश्यकता है। – raffian

+0

यह काम किया, धन्यवाद – raffian

12

यह एक सामान्य प्रश्न है - XPath [] ऑपरेटर उच्च प्राथमिकता दी जाएगी (प्राथमिकता) // छद्म ऑपरेटर से है।

तो:

//someElemName[1] 

someElemName नामित हर तत्व है कि अपने माता पिता की पहली संतान है का चयन करता है - और, XML दस्तावेज के आधार पर, एक से अधिक ऐसे तत्वों हो सकता है।

इसे बदलने के लिए, एक कोष्ठक उपयोग करना चाहिए।

उपयोग:

(//*[local-name() = 'book'])[1]/* 

यह भी ध्यान रखें: XPath पदों में 1 आधारित, नहीं 0-आधारित हैं।

XSLT आधारित सत्यापन:

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

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "(//*[local-name() = 'book'])[1]/*"/> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव निम्नलिखित XML दस्तावेज़ पर लागू किया जाता है:

<books> 
    <book num="1"> 
     <author num="1"/> 
     <title num="1"/> 
    </book> 
    <book num="2"> 
     <author num="2"/> 
     <title num="2"/> 
    </book> 
</books> 

वांछित नोड्स चयनित और उत्पादन को कॉपी कर रहे हैं :

<author num="1"/> 
<title num="1"/> 
+0

@RaffiM: क्या मेरा जवाब आपके लिए उपयोगी था? –

+0

यह मेरे लिए था, इस सवाल का जवाब Dimitre – user151496

+0

@ user1916182 के लिए धन्यवाद, आपका स्वागत है। –

0

मैं एक ही चिंताओं को पूरा करने के लिए है। मैंने निम्नानुसार हल किया:

//*[local-name()='MYNODENAME' and position()=X] 

एक अच्छा दिन है।

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