xslt

2010-06-25 15 views
11

का उपयोग कर किसी विशिष्ट xml तत्व से विशेषता बहिष्कृत करें मैं xslt में नया हूं। मुझे निम्न समस्या है। किसी विशिष्ट तत्व (उदाहरण के लिए div) से एक विशिष्ट विशेषता (उदाहरण में theAttribute) को निकालने के लिए मुझे एक XML में आवश्यकता है। अर्थातxslt

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz" theAtribute="44"> 
     </div> 
     <div id ="ddd" theAtribute="4"> 
     <div id= "ggg" theAtribute="9"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

बनने के लिए

<html> 
    <head>...</head> 
    <body> 
     <div id="qaz"> 
     </div> 
     <div id ="ddd"> 
     <div id= "ggg"> 
     </div> 
     </div> 
     <font theAttribute="foo" /> 
    </body> 
</html> 

कहाँ theAtribute विशेषता हटा दिया गया है। मुझे यह मिला, http://www.biglist.com/lists/xsl-list/archives/200404/msg00668.html जिस पर मैंने उचित समाधान खोजने का प्रयास किया।

यानी <xsl:template match="@theAtribute" />

कौन सा यह पूरे दस्तावेज़ से निकाल दिया ... और अन्य मैच की तरह, अगर चुनते हैं, आदि कुछ भी नहीं काम किया .. :-(आप कृपया मुझे इस पर मदद कर सकते हैं? यह मेरे लिए तुच्छ ध्वनि , लेकिन xslt के साथ, मैं बिल्कुल भी सामना नहीं कर सकते हैं ...

आप सभी अग्रिम

+0

आप कोड प्रारूप तैयार किया जाता करना चाहते हैं, आप कोड को हाइलाइट कर सकते हैं और संपादन पैनल के शीर्ष पर "010,101" बटन क्लिक करें, या पाठ इंडेंट 4 स्थानों। –

उत्तर

22

क्या काम नहीं कर रहा में धन्यवाद? आप एक ही सामग्री चाहते हैं, बस बिना @theAtribute?

यदि हां, सुनिश्चित करें कि आपकी स्टाइलशीट है

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--empty template suppresses this attribute--> 
    <xsl:template match="@theAtribute" /> 
    <!--identity template copies everything forward by default--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

आप केवल कुछ @theAtribute को दबाने के लिए चाहते हैं, तो आप मैच मापदंड अधिक विशिष्ट बनाने के कर सकते हैं: @theAtribute के लिए खाली टेम्पलेट, लेकिन यह भी है कि उत्पादन में किसी और प्रतियां सब कुछ एक पहचान टेम्पलेट है।

<xsl:template match="@theAtribute[../@id='qaz']" /> 

या इस टेम्पलेट:

<xsl:template match="*[@id='qaz']/@theAtribute" /> 

आप निकालना चाहते हैं तो उदाहरण के लिए, यदि आप केवल div जो @id="qaz" है से उस गुण को दूर करना चाहता था, तो आप इस टेम्पलेट का उपयोग कर सकता है @theAttribute सभी div तत्वों से, फिर मिलान अभिव्यक्ति को बदलें:

<xsl:template match="div/@theAtribute" /> 
चयन के अंदर 0
+0

हैलो, इन दोनों को मैंने भी पाया था, मुझे डर है लेकिन वे सहायक नहीं हैं। पहला व्यक्ति हर जगह से "एट्रिब्यूट" हटा देता है (divs, body, font, आदि टैग)। दूसरा दृष्टिकोण id = qaz के साथ सभी नोड्स से @theAtribute से हटा देता है। क्या लिखने का कोई तरीका है ?? मुझे जो चाहिए वह है, इन दोनों का मिश्रण मुझे लगता है, लेकिन मैं xslt पर मील अज्ञानता के कारण स्वरूप को नहीं समझ सकता। मैं सभी divs से केवल एट्रिब्यूट को हटाने और divs से। – Alexandros

+1

मैं देखता हूं। मुझे उस विवरण में एहसास नहीं हुआ था जिसे आप विशेष रूप से 'div/@ theAtribute' को बाहर करना चाहते थे। मैंने जवाब अपडेट कर लिया है।यदि आपके एक्सएमएल तत्व किसी नामस्थान से बंधे हैं, तो आपको अपने एक्सएसएलटी में नेमस्पेस घोषित करने की आवश्यकता हो सकती है, या एक XPATH कथन का उपयोग कर सकते हैं जो स्थानीय नाम (यानी '* [स्थानीय-नाम() =' div ']/@ एट्रिब्यूट') –

+0

यह काम किया !!!! सही समाधान और वास्तव में तेज प्रतिक्रिया। धन्यवाद हंसन !!!! – Alexandros

8

, आप नाम फ़ंक्शन का उपयोग करके विशेषता को बहिष्कृत (या शामिल) कर सकते हैं।

उदाहरण के लिए, <xsl:copy-of select="@*[name(.)!='theAtribute']|node()" />

+0

यह मेरे लिए अच्छा काम करता था, मैं एक विशेषता को प्रतिस्थापित करना चाहता था और फिर बाकी की प्रतिलिपि बनाना चाहता था, और यह अभिव्यक्ति "बाकी" के लिए अच्छी तरह से काम करती थी – davenpcj

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