2011-04-18 15 views
20

2 टेम्पलेट्सXSL टेम्पलेट पूर्वता

है
<template match="vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
    ... 
</xsl:template> 
<xsl:template match="vehicle_details[descendant::color = 'red']/*" > 
    ... 
</xsl:template> 

मेरे सवाल यह है: जो टेम्पलेट परिवर्तन पर प्राथमिकता दी जाएगी। और क्या कोई मुझे एक्सएसएल टेम्पलेट प्राथमिकता के बारे में एक सिंहावलोकन/संसाधन दे सकता है?

अग्रिम धन्यवाद!

उत्तर

38

पूर्ण रिज़ॉल्यूशन प्रक्रिया section 5.5 of the XSLT spec में वर्णित है।

सामान्य तौर पर, निम्नलिखित नियम क्रम में लागू (जैसे कम आयात पूर्वता की वजह से विचार से समाप्त एक टेम्पलेट इसकी प्राथमिकता के स्थायी रूप से निकाल दिया जाता है, भले ही):

  1. आयातित टेम्पलेट्स में टेम्पलेट की तुलना में कम पूर्वता है उनके priority विशेषता में एक उच्च मूल्य के साथ प्राथमिक स्टाइलशीट
  2. टेम्पलेट्स उच्च पूर्वता एक priority विशेषता एक डिफ़ॉल्ट प्राथमिकता दी जाती है बिना
  3. टेम्पलेट्स है। अधिक विशिष्ट पैटर्न वाले टेम्पलेट्स प्राथमिकता लेते हैं।
  4. यह एक त्रुटि है यदि पिछले तीन चरणों में एक से अधिक टेम्पलेट विचाराधीन हैं, लेकिन XSLT प्रोसेसर फ़ाइल में अंतिम में डिफ़ॉल्ट रूप से पुनर्प्राप्त कर सकते हैं।

आपके विशिष्ट मामले में दोनों टेम्पलेट्स की प्राथमिकता समान है, इसलिए ऊपर # 4 लागू होता है। प्रदर्शित करने के लिए:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match= 
      "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
     template1 
    </xsl:template> 
    <xsl:template match="vehicle_details[descendant::color = 'red']/*"> 
     template2 
    </xsl:template> 
</xsl:stylesheet> 

एप्लाइड इस इनपुट करने के लिए (दोनों टेम्पलेट्स मैच):

<root> 
    <vehicle_type>4x4</vehicle_type> 
    <vehicle_details> 
     <color>red</color> 
    </vehicle_details> 
</root> 

आउटपुट:

template2 

लेकिन अगर हम टेम्पलेट्स के आदेश स्वैप:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="vehicle_details[descendant::color = 'red']/*"> 
     template2 
    </xsl:template> 
    <xsl:template match= 
      "vehicle_details[preceding-sibling::vehicle_type = '4x4']/*"> 
     template1 
    </xsl:template> 
</xsl:stylesheet> 

फिर आउटपुट है:

template1 
+1

एक अच्छा स्पष्टीकरण यह बिल्कुल स्पष्ट है कि बनाना चाहिए आयात पूर्वता और 'priority' दो अलग बातें और परवाह किए बिना कर रहे हैं कैसे उच्च प्राथमिकता किसी आयातित स्टाइलशीट में एक टेम्पलेट है, इसका पूर्वता में किसी भी टेम्पलेट का पूर्वता से कम है स्टाइलशीट आयात करना –

+0

@ डिमिट्रे - मैंने नियमों को अनुक्रमिक रूप से पढ़ने का इरादा किया था। शायद वह स्पष्ट नहीं था। मैंने स्पष्टीकरण का एक अतिरिक्त बिट जोड़ा है। –

+2

+1 सही उत्तर। ** निरीक्षण: त्रुटि पुनर्प्राप्ति तंत्र पर भरोसा करना बुरा व्यवहार है। ** –