2011-02-01 18 views
17

मैं एक एक्सएसएल रूपांतरण लिख रहा हूं। मैं एक टेम्पलेट लिखना चाहता हूं जो एक विशेष नोड को छोड़कर दस्तावेज़ के सभी बाल तत्वों से मेल खाता है। मेरे एक्सएमएल इस तरह दिखता है -किसी विशेष तत्व को छोड़कर सभी तत्वों से मेल खाने के लिए xpath कैसे लिखें

<Document> 
    <NodeA></NodeA> 

    <NodeB></NodeB> 

    <ServiceNode></ServiceNode> 

    <NodeX></NodeX> 
</Document> 

मुझे लगता है कि ServiceNode अर्थात NodeANodeX को छोड़कर सभी नोड्स से मेल खाता है एक टेम्पलेट लिखना चाहते हैं। इस Xpath लिखने के लिए कैसे प्राप्त करने के लिए -

<xsl:template match="ALL Nodex Except ServiceNode"> 
+0

अच्छा सवाल है, +1। इस प्रश्न के चार अलग-अलग संभावित अर्थों के लिए चार वैकल्पिक समाधानों के लिए मेरा उत्तर देखें। –

उत्तर

26

मैं एक टेम्पलेट लिखना चाहते हैं कि ServiceNode छोड़कर मैचों सभी नोड्स अर्थात NodeA NodeX करने के लिए।

"नोड" द्वारा आप तत्व मतलब है, तो का उपयोग करें:

<xsl:template match="*[not(self::ServiceNode)]"> 

हैं "नोड" द्वारा आप किसी भी नोड (प्रकार तत्व, पाठ, टिप्पणी, प्रसंस्करण-शिक्षा का) मतलब : यदि आप Document का केवल बच्चों का मिलान नहीं हुआ उपयोग होना चाहते हैं का उपयोग

<xsl:template match="node()[not(self::ServiceNode)]"> 

:

<xsl:template match="Document/node()[not(self::ServiceNode)]"> 

आप केवल शीर्ष तत्व के बच्चों मिलान किया जा उपयोग करना चाहते हैं:

<xsl:template match="/*/node()[not(self::ServiceNode)]"> 
2
<xsl:template match="Document/*[name() != 'ServiceNode']"> 

(या local-name() आप नामस्थान से निपटने के लिए अगर)

+0

मैं एक लाइव मूल्यांकनकर्ता में परीक्षण की सलाह देता हूं जैसे http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm जहां आप // * [name()! = "Pet"] –

+0

जैसे अभिव्यक्ति पेस्ट कर सकते हैं बहुत त्रुटि प्रवण ... –

0
/Document/*[not(name()='ServiceNode')] 
4

बेहतर होगा कि तुम इस अभिव्यक्ति का उपयोग करना चाहिए:

*[not(self::ServiceNode)] 

जैसा कि एक्सएसएलटी में शामिल है:

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

    <xsl:template match="/*"> 
     <xsl:apply-templates select="*[not(self::ServiceNode)]"/> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:value-of select="."/> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
इस एक्सएमएल नमूना के साथ

:

1 
2 
4 
+4

सही। यह नाम() या स्थानीय नाम() पर परीक्षण से बेहतर है। XPath 2 में।0 एक विकल्प है (* सेवा नोड को छोड़कर) –

+0

मैं सहमत हूं। 'नाम()' से बेहतर। –

+0

@Alejandro, अगर आप मानते हैं, तो ऊपर उठना न भूलें;) – Flack

1

आप दो टेम्पलेट्स इस्तेमाल कर सकते हैं:

<Document> 
    <NodeA>1</NodeA> 
    <NodeB>2</NodeB> 
    <ServiceNode>3</ServiceNode> 
    <NodeX>4</NodeX> 
</Document> 

यह एक सही परिणाम दे देंगे

<xsl:template match="Document/*"> 
    ...do something... 
</xsl:template> 


<xsl:template match="Document/ServiceNode" /> 

बाद में टेम्पलेट वरीयता दी जाएगी, तो पहला टेम्पलेट सर्विस नोड को छोड़कर सबकुछ से मेल खाएगा।

+0

यह कुछ मामलों में उपयोगी हो सकता है, इसके अलावा यह इस प्रश्न का सही उत्तर नहीं देता है। –

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

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