मैं XSLT का एक ब्लॉक है कि एक को बदलने के दौरान कई बार लागू किया जा सकता है एक टेम्पलेट चला सकते हैं। लेकिन मैं वास्तव में इसे लागू करने के लिए पहली बार चलाने के लिए चाहता हूं, यह सभी अव्यवस्थित समय को छोड़ दिया जाएगा। मैं यह कैसे करु? स्टाइलशीट में मैं एक वैश्विक चर को परिभाषित:XSLT में, मैं केवल एक बार
<xsl:variable name="run_once" select="0"/>
तो है मैं एक टेम्पलेट कहा जाता है जो कई बार:
उदाहरण के लिए, इस बात की तरह मैं क्या करना चाहते है
<xsl:template name="some_template">
<xsl:if test="$run_once != 1">
<xsl:variable name="run_once" select="1"/>
<xsl:text>THIS TEXT SHOULD APPEAR ONLY ONCE</xsl:text>
</xsl:if>
</xsl:template>
बेशक यह काम नहीं करता, क्योंकि चर बदला नहीं जा सकता, केवल अतिभारित। तो, एक बार जब कुछ_टैम्पलेट $ run_once से बाहर निकलता है तो एक बार फिर 0 होता है और पाठ को हर बार टेम्पलेट कहा जाता है। क्या कुछ प्रकार की ifdef कार्यक्षमता या अन्य वैश्विक वस्तु सेट कर सकते हैं? एक
- मेरे इनपुट कच्चे XML में डेटा है, मेरे उत्पादन होता है:
आप में कारण है कि मैं ऐसा करना चाहते हैं रुचि रखते हैं, नीचे मेरी समस्या का एक अधिक विस्तृत विवरण और समाधान मैं प्रयोग किया जाता है वर्डएमएल प्रारूप में रिपोर्ट करें।
- इनपुट में मेरे पास नोड्स की एक श्रृंखला है (नाम नाम)। कुछ, लेकिन सभी नहीं, इन नोड्स के उत्पादन में दिखाया गया है की जरूरत है। नोड केवल तभी प्रदर्शित किया जाना चाहिए जब XPATH हेयर्यलोगिक सत्य है (बालों का लॉजिक स्पष्ट रूप से लंबा है और परिसर)।
- नोड के पास प्रकार ( में एक उप-नोड में संग्रहीत) है। इनपुट, सभी theNode एक ही प्रकार के के हमेशा एक साथ समूहीकृत कर दिया जाएगा। उत्पादन, सभी theNode ही प्रकार के के उस प्रकार के लिए एक विशिष्ट शीर्षक के अंतर्गत वर्गीकृत किया जाना चाहिए (वहाँ प्रत्येक प्रकार के लिए केवल एक ही शीर्षक होना चाहिए)।
... <xsl:apply-templates select="theNode[hairyLogic]"/> ... <xsl:template match="theNode"> <xsl:if test="count(preceding-sibling::theNode[type = current()/type and hairyLogic])=0"> <xsl:choose> <xsl:when test="type = 'TYPE1a' or type = 'TYPE1b'"> <xsl:call-template name="TYPE1Heading"/> </xsl:when> <xsl:when test="type = 'TYPE2'"> <xsl:call-template name="TYPE2Heading"/> </xsl:when> </xsl:choose> </xsl:if> ... </xsl:template>
मैं शीर्षकों के लिए नामित किया गया टेम्पलेट का उपयोग करने के लिए है क्योंकि वे बुनियादी WordML कि इनपुट XML में कोई भी डेटा पर निर्भर नहीं करता शामिल चुना है:
यह समाधान मैं का उपयोग कर समाप्त हो गया है।
मैं क्योंकि hairyLogic दोहराया और है इस समाधान पसंद नहीं है अगर बयान जटिल और पढ़ने के लिए कठिन है। हो सकता है कि आपके पास एक बेहतर समाधान है जिसके लिए परिवर्तनीय चर की आवश्यकता नहीं है?
"पाइथोनिक का एक्सएसएलटी समतुल्य क्या है? Xslt-y?" - यह "घोषणात्मक" है –
हां, मुझे बाधाएं हैं जिनकी मैंने पूरी तरह से विस्तार नहीं किया है (यदि आप रुचि रखते हैं तो प्रश्न में जोड़ा गया है)। मैंने जिस तरह से वर्णन किया है, उस समस्या को हल किया। मुझे यह पसंद नहीं है क्योंकि "somelogic" लंबा, गन्दा है, और अब कई बार दोहराया जाता है। अगर मैं XPATH कोड पार्स किया गया था, तो मैं यह निर्देशित कर सकता हूं कि मैं अन्य कार्यात्मक भाषाओं में कर सकता हूं। फिर मैं एक चर में "somelogic" के बुरे बिट स्टोर कर सकता हूं और जरूरत पड़ने पर इसे मेरे भाव में डाल सकता है। – oillio