क्यों पूर्व कोड आउटपुट पाठ, क्यों मैं आग्रह करना चाहिए था 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
+1: ग्रेट स्पष्टीकरण - स्वीकृत उत्तर से कहीं अधिक पूर्ण, हालांकि स्वीकार्य उत्तर विशिष्ट प्रश्न का भी उत्तर देता है। –
@donroby: धन्यवाद। मेरा जवाब प्रश्न का समाधान क्यों नहीं करेगा और इसका उत्तर क्यों देगा? कोई भी व्यक्ति जो इस समस्या का सामना कर रहा है और मेरा जवाब पढ़ रहा है, उसकी समस्या का कारण समझ जाएगा और इसे ठीक करने में सक्षम होगा। –
@donroby: मेरा जवाब एक सटीक उत्तर प्रदान करता है: '"तो, रिपोर्ट किया गया व्यवहार अंतर्निहित टेम्पलेट्स के अनुप्रयोग का परिणाम है - उनमें से तीनों में से दूसरा" ' –