2010-07-29 14 views
62

हाय मैंने एक रूपांतरण किया था जो एक टैग को छोड़ देता है यदि यह शून्य है।एक्सएसएलटी डिफ़ॉल्ट रूप से सभी पाठ क्यों आउटपुट करता है?

मैं यह जांचना चाहता था कि मेरा रूपांतरण ठीक काम कर रहा है, इसलिए इसे मैन्युअल रूप से जांचने के बजाय, मैंने एक और एक्सएसएलटी कोड लिखा है जो ओयूटीटीयूटी एक्सएमएल में उस विशेष टैग की मौजूदगी की जांच करता है, अगर यह शून्य है, तो दूसरा एक्सएसएलटी को "फाउंड" टेक्स्ट आउटपुट करना चाहिए। (मैं वास्तव में उत्पादन के कुछ एक्सएमएल तरह की आवश्यकता नहीं है, लेकिन मैं सिर्फ खोज के लिए XSLT उपयोग कर रहा हूँ।)

जब मैं इस XSL कोड :: साथ की कोशिश की

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']"> 
     FOUND 
    </xsl:template> 
</xsl:stylesheet> 

यह सब पाठ डेटा है कि आउटपुट एक्सएमएल फ़ाइल में मौजूद है,

कि से बचने के लिए, मैं इस कोड ::

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/SiebelMessage//SuppressCalendar[.!='']"> 
     FOUND 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

क्यों पूर्व कोड आउटपुट पाठ, क्यों मैं आग्रह करना चाहिए था XSL अन्य सभी पाठ की अनदेखी करने के लिखने के लिए था? यह है कि सभी एक्सएमएल पार्सर्स का व्यवहार या केवल मेरा (मैं msxml पार्सर का उपयोग कर रहा हूं)।

उत्तर

124

क्यों पूर्व कोड आउटपुट पाठ, क्यों मैं आग्रह करना चाहिए था XSL सभी अन्य पाठ की अनदेखी करने के? है कि सभी XML पारसर्स के व्यवहार या केवल के अपने ही

आप सबसे मौलिक XSLT सुविधाओं विशिष्टता के रूप में विनिर्दिष्ट में से एक को खोज रहे हैं: built-in templates of XSLT

the Spec से:

वहाँ एक अंतर्निहित टेम्पलेट नियम को पुनरावर्ती प्रसंस्करण स्टाइलशीट में स्पष्ट टेम्पलेट शासन द्वारा एक सफल पैटर्न मैच के अभाव में जारी रखने की अनुमति है। यह टेम्पलेट नियम दोनों तत्व नोड्स और रूट नोड पर लागू होता है। निम्नलिखित में निर्मित टेम्पलेट शासन के बराबर दिखाता है:

<xsl:template match="*|/"> 
    <xsl:apply-templates/> 
</xsl:template> 

वहाँ भी प्रत्येक विधा, पुनरावर्ती प्रसंस्करण में एक ही मोड में जारी रखने के लिए अनुमति देता है, जिसके लिए एक अंतर्निहित टेम्पलेट नियम है स्टाइलशीट में एक स्पष्ट टेम्पलेट नियम द्वारा सफल पैटर्न मिलान की अनुपस्थिति। यह टेम्पलेट नियम दोनों तत्व नोड्स और रूट नोड पर लागू होता है। निम्नलिखित अंतर्निहित टेम्पलेट मोड एम के लिए नियम के बराबर दिखाता है।

<xsl:template match="*|/" mode="m"> 
    <xsl:apply-templates mode="m"/> 
</xsl:template> 

वहाँ भी पाठ के लिए एक में निर्मित टेम्पलेट नियम है और नोड्स प्रतियां पाठ के माध्यम से विशेषता:

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

निर्मित प्रोसेसिंग निर्देश के लिए टेम्पलेट नियम और टिप्पणी है कुछ मत करो।

<xsl:template match="processing-instruction()|comment()"/> 

नाम स्थान नोड्स के लिए निर्मित टेम्पलेट नियम कुछ भी नहीं करना भी है। कोई पैटर्न नहीं है जो नामस्थान नोड से मेल खा सकता है; इसलिए, अंतर्निहित टेम्पलेट नियम एकमात्र टेम्पलेट नियम है जो नामस्थान नोड्स के लिए लागू होता है।

में निर्मित टेम्पलेट नियमों व्यवहार कर रहे हैं जैसे कि वे परोक्ष स्टाइलशीट से पहले आयात किया गया और तो अन्य सभी टेम्पलेट नियमों की तुलना में कम आयात पूर्वता है। इस प्रकार, लेखक एक स्पष्ट टेम्पलेट नियम को एक स्पष्ट टेम्पलेट नियम सहित ओवरराइड कर सकता है।

तो, रिपोर्ट किया गया व्यवहार अंतर्निहित टेम्पलेट्स के अनुप्रयोग का परिणाम है - उनमें से तीनों में से पहला और दूसरा।

यह एक अच्छा XSLT डिज़ाइन पैटर्न अपने स्वयं के साथ निर्मित टेम्पलेट्स ताकि प्रोग्रामर तुरंत अपने परिवर्तन जानता है कि जब भी कहा जाता है एक त्रुटि संदेश जारी करेगा ओवरराइड करने के लिए "लीक" है:

के लिए उदाहरण पर, यदि इस XML दस्तावेज़ है:

<a> 
    <b> 
    <c>Don't want to see this</c> 
    </b> 
</a> 

और यह इस बदलाव के साथ कार्रवाई की है:

<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="a|b"> 
    <xsl:copy> 
     <xsl:attribute name="name"> 
     <xsl:value-of select="name()"/> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

परिणाम है:

<a name="a"> 
    <b name="b">Don't want to see this</b> 
</a> 

और प्रोग्रामर बहुत उलझन में कैसे अवांछित पाठ दिखाई दिया हो जाएगा।

हालांकि, सिर्फ इस catch-all template जोड़ने तुरंत किसी भी तरह के भ्रम और पकड़ त्रुटियों से बचने में मदद करता है:

<xsl:template match="*"> 
    <xsl:message terminate="no"> 
    WARNING: Unmatched element: <xsl:value-of select="name()"/> 
    </xsl:message> 

    <xsl:apply-templates/> 
</xsl:template> 

अब, भ्रामक उत्पादन के अलावा प्रोग्रामर एक चेतावनी है कि समस्या तुरंत बताते हो जाता है:

WARNING: Unmatched element: c 
+4

+1: ग्रेट स्पष्टीकरण - स्वीकृत उत्तर से कहीं अधिक पूर्ण, हालांकि स्वीकार्य उत्तर विशिष्ट प्रश्न का भी उत्तर देता है। –

+0

@donroby: धन्यवाद। मेरा जवाब प्रश्न का समाधान क्यों नहीं करेगा और इसका उत्तर क्यों देगा? कोई भी व्यक्ति जो इस समस्या का सामना कर रहा है और मेरा जवाब पढ़ रहा है, उसकी समस्या का कारण समझ जाएगा और इसे ठीक करने में सक्षम होगा। –

+0

@donroby: मेरा जवाब एक सटीक उत्तर प्रदान करता है: '"तो, रिपोर्ट किया गया व्यवहार अंतर्निहित टेम्पलेट्स के अनुप्रयोग का परिणाम है - उनमें से तीनों में से दूसरा" ' –

12

वहाँ कई built in template rules XSL में हैं, जिनमें से एक यह है:

<xsl:template match="text()|@*"> 
    <xsl:value-of select="."/> 
</xsl:template> 

यह पाठ आउटपुट।

+0

धन्यवाद, तो क्या यह विशेष पार्सर या सामान्य रूप से विशिष्ट है? –

+0

मुझे लगता है, सभी पार्सर्स कोज़ के लिए इसका सामान्य नियम इसके डब्ल्यू 3 सी विनिर्देश। ठीक है, धन्यवाद :) –

+1

@infant प्रोग्रामर - यह कल्पना में है, जैसा कि आपने नोट किया है ...सभी एक्सएसएल पार्सर्स को उन्हें लागू करना है। – Oded

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

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