2009-10-25 7 views
6

मुझे पता है कि मुझे यहां कुछ याद आ रहा है। नीचे एक्सएसएलटी परिवर्तन में, वास्तविक परिणाम वांछित परिणाम से मेल नहीं खाता है।मैं प्रत्येक चयनित नोड में प्रत्येक के लिए टेम्पलेट्स कैसे लागू करूं?

for-each के अंदर, मैं प्रत्येक चयनित track तत्व में match="track" टेम्पलेट लागू करना चाहता हूं। यदि मैं एक्सएसएलटी को सही ढंग से समझ गया हूं, तो वर्तमान सेटअप के साथ प्रत्येक चयनित track तत्व के केवल बाल नोड्स टेम्पलेट्स के साथ मेल खाते हैं, न कि track तत्व स्वयं।

मैं track तत्वों को वांछित के रूप में टेम्पलेट के माध्यम से कैसे बना सकता हूं? क्या मुझे अपने पूरे दृष्टिकोण पर पुनर्विचार करने की ज़रूरत है?

नोट: परिवर्तन PHP का उपयोग करके निष्पादित किया जाता है। ब्रेवटी के लिए एक्सएमएल घोषणाएं छोड़ी गई हैं।

एक्सएमएल दस्तावेज़:

<album> 
    <title>Grave Dancers Union</title> 
    <track id="shove">Somebody To Shove</track> 
    <track id="gold">Black Gold</track> 
    <track id="train">Runaway Train</track> 
    <producer>Michael Beinhorn</producer> 
</album> 

XSL स्टाइल शीट:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/album"> 
     <ol> 
      <xsl:for-each select="track"> 
       <li><xsl:apply-templates/></li> 
      </xsl:for-each> 
     </ol> 
    </xsl:template> 

    <xsl:template match="track"> 
     <a href="{@id}"><xsl:apply-templates/></a> 
    </xsl:template> 
</xsl:stylesheet> 

परिणाम:

<ol> 
    <li>Somebody To Shove</li> 
    <li>Black Gold</li> 
    <li>Runaway Train</li> 
</ol> 

वांछित परिणाम:

<ol> 
    <li><a href="shove">Somebody To Shove</a></li> 
    <li><a href="gold">Black Gold</a></li> 
    <li><a href="train">Runaway Train</a></li> 
</ol> 

उत्तर

9

मैं 'ndim' से सहमत हूं कि आपको संभवतः अपने एक्सएसएलटी को एक्सएसएल से दूर करने के लिए पुन: स्थापित करना चाहिए: प्रत्येक लूप के लिए।XSL के भीतर मौजूदा ट्रैक नोड का चयन करने के लिए आवेदन-टेम्पलेट्स:

वैकल्पिक रूप से, आप XSL में संशोधन कर सकता है के लिए-प्रत्येक

<xsl:for-each select="track"> 
    <li> 
     <xsl:apply-templates select="." /> 
    </li> 
</xsl:for-each> 

XSL रखते हुए: के लिए-प्रत्येक, कम से कम, आप करने की अनुमति होगी वांछित अगर पटरियों को किसी अन्य क्रम में सॉर्ट करें।

+0

सॉर्टिंग पर अच्छा पकड़। मुझे लगता है कि सॉर्टिंग के कारण यह सबसे अच्छा समाधान है। – ndim

+0

मैं शपथ ले सकता था कि मैंने पहले ही यह कोशिश की है, लेकिन मुझे नहीं लगता। यह वही है जो मैं खोज रहा था, यद्यपि! – Jakob

4

मैं इसे एक छोटे से पुनर्गठन चाहते हैं (यदि आप for-each दृष्टिकोण छँटाई की जरूरत नहीं है संभव बनाता है):

<xsl:template match="/album"> 
    <ol> 
    <xsl:apply-templates select="track"/> 
    </ol> 
</xsl:template> 

<xsl:template match="track"> 
    <li><a href="{@id}"><xsl:apply-templates/></a></li> 
<xsl:template> 

यह छोटे और बात करने के लिए और अधिक लग रहा है , IMHO।

मैं अपने

<xsl:for-each select="track"> 
     <li><xsl:apply-templates/></li> 
    </xsl:for-each> 

for-each के साथ सभी ट्रैक तत्वों के माध्यम से चलता है, और उसके बाद उसके वंश के लिए डिफ़ॉल्ट नियम लागू होता है लगता है। तो for-each की सामग्री में समान संदर्भ नोड है क्योंकि match="track" टेम्पलेट है, और इस प्रकार match="track" टेम्पलेट कभी मेल नहीं खाता है।

तुम सच है कि रास्ते में for-each का उपयोग करना चाहते हैं, तो आप अपने दृष्टिकोण में निम्नलिखित दो चीजों में से या तो बदलने के लिए की आवश्यकता होगी:

  1. match="track" टेम्पलेट के लिए एक name="track" विशेषता जोड़ें, और उसके बाद <xsl:call-template/> का उपयोग for-each (मेरा विचार, और Tim C से भी कम)
  2. <xsl:apply-templates select="."/> का उपयोग करके Tim C का समाधान का उपयोग करें। इसका नामकरण से बचने और ट्रैक को क्रमबद्ध करने की संभावना रखने का लाभ है।
+0

पुनर्गठन समाधान मुझे जितना चाहें उतना मॉड्यूलर लगता है (यह मुझे पृष्ठ/साइट पर कहीं और 'में ट्रैक भी शामिल करने की अनुमति नहीं देता है, कम से कम उसी स्टाइलशीट का उपयोग नहीं कर रहा है) लेकिन आप शायद सही हैं कि यह इस उदाहरण के लिए सबसे आसान समाधान है। – Jakob

+0

@ जैकोब मुझे पता है कि यह प्राचीन है, लेकिन मैं सिर्फ यह इंगित करना चाहता हूं कि आप उसी मोड के लिए एक और टेम्पलेट चुनने के लिए 'मोड' विशेषता का उपयोग कर सकते हैं। '' और ' ...' की तरह। – janek37

0

मुझे लगता है कि लागू-टेम्पलेट्स और टेम्पलेट साधनों का उपयोग करते क्लीनर समाधान है:

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

    <xsl:template match="/"> 
    <body> 
     <xsl:apply-templates select="album" mode="ol" /> 
    </body> 
    </xsl:template> 

    <xsl:template match="album" mode="ol"> 
    <ol> 
     <xsl:apply-templates select="track" mode="li" /> 
    </ol> 
    </xsl:template> 

    <xsl:template match="track" mode="li"> 
    <li> 
     <xsl:apply-templates select="." /> 
    </li> 
    </xsl:template> 

    <xsl:template match="track"> 
    <a href="{@id}"> 
     <xsl:value-of select="." /> 
    </a> 
    </xsl:template> 


</xsl:stylesheet> 

परिणामों में:

<body> 
    <ol> 
    <li> 
     <a href="shove">Somebody To Shove</a> 
    </li> 
    <li> 
     <a href="gold">Black Gold</a> 
    </li> 
    <li> 
     <a href="train">Runaway Train</a> 
    </li> 
    </ol> 
</body> 
0

बयान प्रत्येक के लिए-एल्बम से संदर्भ नोड ट्रैक करने के लिए बदल जाता है। डिफ़ॉल्ट रूप से लागू-टेम्पलेट कॉल संदर्भ नोड के बच्चे नोड्स पर टेम्पलेट लागू करता है जो आपके मामले में ट्रैक तत्व के बच्चे नोड्स होते हैं। इसलिए आपका टेम्पलेट 'ट्रैक' से मेल खाता है कभी हिट नहीं होता है।