2012-09-06 3 views
12

मैं एक टेम्पलेट को एक मोड के साथ लागू करना चाहता हूं जो चर वैल्यू पर निर्भर करता है।लागू-टेम्पलेट्स के मोड में एक चर के मान का उपयोग करें

<xsl:variable name="mode" select="@attribute"/> 
<xsl:apply-templates mode="{$mode}"/> 

मुझे त्रुटि मिलती है कि स्टाइलशीट को संकलित नहीं किया जा सकता है। मोड का मान QName होना चाहिए, लेकिन यह "{$ mode}" है।

क्या चर पर निर्भर मोड का उपयोग करने की संभावना है?

+0

क्या आप क्या करना चाहते वाक्य रचना अवैध है, लेकिन यह XSLT 1.0 में * संभव * है "टेम्पलेट संदर्भ" सिद्धांत का उपयोग करके, उसी प्रभाव को प्राप्त करने के लिए जो FXSL लाइब्रेरी की नींव है। –

+0

इस विचार के लिए धन्यवाद! मैंने इसे समझने की कोशिश की, लेकिन मैं एक्सएसएलटी में नया हूं और कार्यात्मक प्रोग्रामिंग के साथ ज्यादा अनुभव नहीं है। वर्णित मामले के लिए, यह "अधिक इंजीनियर" है। शायद, मैं इसे कुछ बार उपयोग कर सकता हूं, जब मुझे इसके साथ अधिक अनुभव होता है। – maria90

+0

maria90, यह जानना पर्याप्त है कि ऐसी तकनीक मौजूद है - फिर जब भी आवश्यक हो इसका उपयोग करें। –

उत्तर

7

आप एक अभिव्यक्ति के आधार पर एक निश्चित मोड का उपयोग करने के लिए है ही एकमात्र विकल्प

<xsl:choose> 
    <xsl:when test="@attribute = 'foo'"> 
     <xsl:apply-templates mode="bar"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:apply-templates/> 
    </xsl:otherwise> 
</xsl:choose> 

या एक xsl:if के साथ एक ही उपयोग करने के लिए है। mode विशेषता मान XSLT 2.0 में क्रमशः XSLT 1.0 में QName होने की आवश्यकता है QName या #current या #default 'जैसे विशेष टोकन की अनुमति देता है। लेकिन आप रन-टाइम पर mode मान की गणना नहीं कर सकते हैं।

+0

समस्या को हल करने का यह मेरा पहला विचार था। मैं चर के विशिष्ट मानों का परीक्षण करना चाहता था। फिर भी, मैं इस तरह से उपयोग करूंगा क्योंकि एफएक्सएसएल मेरे लिए भारी है। – maria90

3

मोड विशेषता मूल्य टेम्पलेट्स (एवीटी) के लिए वैध उम्मीदवार नहीं है। आप बस यह नहीं कर सकते हैं।

XSLT 2.0 spec से

:

[परिभाषा: एक विशेषता है जो इस तरह के एक शाब्दिक परिणाम तत्व की विशेषता के रूप एक विशेषता मान के रूप में नामित किया गया है टेम्पलेट, में, एक अभिव्यक्ति अभिव्यक्ति आसपास के द्वारा किया जा सकता घुंघराले ब्रैकेट्स ({})] के साथ। तो कहां ऐसा नहीं कर सकते

मोड, कल्पना में एवीटी रूप में नामित नहीं किया गया है।

0

मुझे त्रुटि मिलती है कि स्टाइलशीट को संकलित नहीं किया जा सकता है। मोड का मान QName होना चाहिए, लेकिन यह "{$ mode}" है।

क्या चर पर निर्भर मोड का उपयोग करने की संभावना है?

नहीं, यह किसी भी एक्सएसएलटी संस्करण - 1.0, 2.0 या 3.0 में समर्थित नहीं है।

आप उच्च आदेश कार्य का अनुकरण करने (HOF) प्रभाव में कोशिश कर रहे हैं के रूप में, आप XSLT 1.0 में यह करने के लिए FXSL की अंतर्निहित सिद्धांत का उपयोग कर सकते हैं।

FXSL 1.x शुद्ध एक्सएसएलटी 1.0 में लिखे गए टेम्पलेट्स की एक लाइब्रेरी है जो एचओएफ का समर्थन/अनुकरण करता है।

यहां एक संपूर्ण इन सिद्धांतों के आधार पर समाधान है:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:f="http://fxsl.sf.net" exclude-result-prefixes="f"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

    <f:inc/> 
    <f:double/> 

<xsl:variable name="vModeInc" select="document('')/*/f:inc[1]"/> 
<xsl:variable name="vModeDouble" select="document('')/*/f:double[1]"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <nums> 
    <xsl:apply-templates select="$vModeInc"> 
     <xsl:with-param name="pNodes" select="node()"/> 
    </xsl:apply-templates> 
    </nums> 
============== 
    <nums> 
    <xsl:apply-templates select="$vModeDouble"> 
     <xsl:with-param name="pNodes" select="node()"/> 
    </xsl:apply-templates> 
    </nums> 
</xsl:template> 

<xsl:template match="f:inc"> 
    <xsl:param name="pNodes"/> 
    <xsl:apply-templates select="$pNodes" mode="incr"/> 
</xsl:template> 

<xsl:template match="f:double"> 
    <xsl:param name="pNodes"/> 
    <xsl:apply-templates select="$pNodes" mode="double"/> 
</xsl:template> 

<xsl:template match="num" mode="incr"> 
    <num><xsl:value-of select=".+1"/></num> 
</xsl:template> 

<xsl:template match="num" mode="double"> 
    <num><xsl:value-of select=".*2"/></num> 
</xsl:template> 
</xsl:stylesheet> 

इस बदलाव निम्नलिखित XML दस्तावेज़ पर लागू किया जाता है:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

चाहता था, सही परिणाम है उत्पादित - nums/num तत्व दो मोडों में से एक (प्रत्येक) में संसाधित तत्व, डी चर पर लंबित निर्दिष्ट - $vModeInc या $vModeDouble (1 प्रत्येक मान को जोड़ा गया) (प्रत्येक मान दो से गुणा किया जाता):

<nums> 
    <num>2</num> 
    <num>3</num> 
    <num>4</num> 
    <num>5</num> 
    <num>6</num> 
    <num>7</num> 
    <num>8</num> 
    <num>9</num> 
    <num>10</num> 
    <num>11</num> 
</nums> 
============== 
    <nums> 
    <num>2</num> 
    <num>4</num> 
    <num>6</num> 
    <num>8</num> 
    <num>10</num> 
    <num>12</num> 
    <num>14</num> 
    <num>16</num> 
    <num>18</num> 
    <num>20</num> 
</nums> 
+0

+1 यह चालाक है। मैंने एफएक्सएसएल पर नहीं रखा है, लेकिन कामना की है कि मेरे पास ऐसा करने का समय हो। :-) किसी और के लिए जो पढ़ रहा है, ऊपर एक्सएसएलटी के माध्यम से पता लगाने के लिए आपका समय लायक है और देखें कि यह क्या कर रहा है। – LarsH

+0

@ लार्सएच, धन्यवाद, बस एफएक्सएसएल 2 पर चरम मार्कअप भाषा पत्र पढ़ें - इसमें बहुत अधिक समय नहीं लगता है। :) –

+0

क्या आप उस पेपर को लिंक दे सकते हैं? मैंने googled और यह पाया: http://fxsl.sourceforge.net/ जिसमें 2 पेपर के लिंक हैं, जिनमें से दोनों टूटा हुआ है। ओह, क्या यह है? http://conferences.idealliance.org/extreme/html/2006/Novatchev01/EML2006Novatchev01.html – LarsH

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