2011-08-01 28 views
5

में भिन्न कई तत्वों में से एक का चयन करना मैं एक अनुभवी प्रोग्रामर हूं, लेकिन एक्सएसएलटी के लिए एक नौसिखिया हूं और इसे काफी परेशान कर रहा हूं। मैं क्षमा चाहता हूं कि यह एक प्रश्न है जिसे पहले पूछा गया था, लेकिन मैं एक्सएसएलटी द्वारा इतना निराश हूं कि मुझे यह भी सुनिश्चित नहीं है कि क्या खोजना है ...विशेषता

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

उदाहरण के लिए, मैं एक एक्सएमएल फ़ाइल है (इसे कहते "फ़ाइल 1") कि

<food> 
    <snack>Chips</snack> 
    <snack type="nuts">Peanuts</snack> 
</food> 

और एक अन्य एक्सएमएल फ़ाइल शामिल ("फ़ाइल 2") जिसमें

<food> 
    <snack>Cheese puffs</snack> 
</food> 

मुझे लगता है एक एक्सएसएलटी की आवश्यकता है जो फाइल 1 को प्रोसेस करने पर केवल "मूंगफली" (लेकिन "चिप्स" नहीं) आउटपुट करता है, लेकिन फिर भी फाइल 2 के लिए "पनीर पफ्स" आउटपुट करता है (यानी मैं केवल उन तत्वों का चयन नहीं कर सकता जिनके पास "टाइप" विशेषता है, वह बहुत ही आसान होगा)।

यह शायद आसान है, लेकिन मैं अटक हूँ ...

+0

अच्छा प्रश्न, +1। सबसे मौलिक और शक्तिशाली एक्सएसएलटी डिजाइन पैटर्न के आधार पर एक पूर्ण, लघु और आसान समाधान के लिए मेरा उत्तर देखें - पहचान नियम को ओवरराइड करना। स्पष्टीकरण भी प्रदान किया जाता है। –

उत्तर

1

यह परिवर्तन:

<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= 
    "*[snack/@type]/snack[not(@type)]"/> 
</xsl:stylesheet> 

दोनों ही मामलों में वांछित परिणाम पैदा करता है।

स्पष्टीकरण:

  1. पहचान नियम/टेम्पलेट प्रतियां प्रत्येक नोड "के रूप में-है"।

  2. दूसरा टेम्पलेट एक type विशेषता snack तत्वों है कि एक type विशेषता भाई है कि बिना किसी भी snack तत्व के लिए पहचान टेम्पलेट अधिभावी है। इस टेम्पलेट में खाली निकाय है, जो आउटपुट से मिलान किए गए तत्व को प्रभावी ढंग से "हटा देता है"।

+0

शानदार! बहुत अच्छा काम करता है! धन्यवाद। मेरी जंगली कल्पनाओं में कभी भी मैंने 2 टेम्पलेट्स के साथ समस्या को हल करने का विचार नहीं किया होगा: जो कि मैं जो चाहता हूं उसके विपरीत लगभग दूसरा करता है, और दूसरा जो सचमुच कुछ भी नहीं करता है। एक्सएसएलटी मुहावरे इतने प्रतिद्वंद्वी क्यों हैं :-) – NumerousHats

0

एक निश्चित XML तत्व केवल एक बार दिखाई देता है तो मैं उसकी सामग्री उत्पादन चाहते हैं, लेकिन अगर यह एक बार से अधिक होती है, तो मैं उन एक निश्चित विशेषता है कि केवल सामग्री चाहते हैं।

कि का एक सीधा अनुवाद किया जाएगा

if (count(snack) = 1) then snack else snack[@type='nuts'] 

जो वैध XPath 2.0 वाक्य रचना है - अगर आप 1.0 में यह सब करने की ज़रूरत तो यह काफी सीधे एक बराबर XSL में तब्दील हो (हालांकि verbosely): चुनें ।

तुम भी ऊपर से अधिक संक्षिप्त कुछ, आप भी XPath 2,0

(snack[@type='nuts'], snack)[1] 

जो पहले type = 'पागल' है, तो सब नाश्ते के साथ नाश्ते युक्त एक सूची बनाता में लिख सकते हैं चाहते हैं, और फिर इस सूची से पहला आइटम चुनता है।

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