2009-08-27 14 views
6

मैं 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 दोहराया और है इस समाधान पसंद नहीं है अगर बयान जटिल और पढ़ने के लिए कठिन है। हो सकता है कि आपके पास एक बेहतर समाधान है जिसके लिए परिवर्तनीय चर की आवश्यकता नहीं है?

उत्तर

2

मैं नामित टेम्पलेट्स से अधिक मैच टेम्पलेट का उपयोग कर, क्योंकि यह अधिक है, अच्छी तरह से, pythonic की XSLT बराबर क्या सुझाव देंगे? XSLT-y?मुझे लगता है कि आप पाएंगे कि आप उस प्रसंस्करण पद्धति में समस्याओं को हल कर सकते हैं।

यदि आप कुछ अज्ञात आवश्यकता के कारण नामित टेम्पलेट्स का उपयोग करने पर जोर देते हैं, तो आप पाएंगे कि यदि आप अपने तर्क को दोबारा पहचानने में आसान बनाने के लिए अपने तर्क को दोबारा जोड़ते हैं, तो आप अपने तर्क को पूरी तरह सरल बना देंगे।

क्या आप स्पष्ट कर सकते हैं कि पहली घटना की आवश्यकता होने पर आप इसका पता क्यों नहीं लगा सकते? हम शायद एक एक्सपैथ अभिव्यक्ति तैयार करने में मदद कर सकते हैं जो आपको वह करना चाहता है जो आप चाहते हैं। जैसे

<xsl:template name="some_template"> 
    <xsl:variable name="EXPRESSION" select=".[somelogic='true']"/> 
    <xsl:if test="$EXPRESSION"> 
     <xsl:text>THIS TEXT SHOULD APPEAR ONLY ONCE</xsl:text> 
    </xsl:if> 
</xsl:template> 

XSLT के बाद से नियतात्मक है - (जब तक आप अजीब विस्तार सामान कर रहे हैं) आप तय कर सकते हैं जब पहली बार इनपुट करने के लिए तर्क लगाने से उचित है - पूरी तरह से कार्यात्मक होने के रूप में ग्रेग डाल का प्रभाव। साथ ही, आपके पास टेम्पलेट में संदर्भ नोड तक पहुंच है ताकि आप जान सकें कि इसे कहां से बुलाया जा रहा है।

+0

"पाइथोनिक का एक्सएसएलटी समतुल्य क्या है? Xslt-y?" - यह "घोषणात्मक" है –

+0

हां, मुझे बाधाएं हैं जिनकी मैंने पूरी तरह से विस्तार नहीं किया है (यदि आप रुचि रखते हैं तो प्रश्न में जोड़ा गया है)। मैंने जिस तरह से वर्णन किया है, उस समस्या को हल किया। मुझे यह पसंद नहीं है क्योंकि "somelogic" लंबा, गन्दा है, और अब कई बार दोहराया जाता है। अगर मैं XPATH कोड पार्स किया गया था, तो मैं यह निर्देशित कर सकता हूं कि मैं अन्य कार्यात्मक भाषाओं में कर सकता हूं। फिर मैं एक चर में "somelogic" के बुरे बिट स्टोर कर सकता हूं और जरूरत पड़ने पर इसे मेरे भाव में डाल सकता है। – oillio

2

क्योंकि एक्सएसएलटी पूरी तरह कार्यात्मक भाषा है, नहीं वैश्विक चर जो आप सेट कर सकते हैं।

आप के बजाय परिस्थितियों के तहत आप अपने some_template टेम्पलेट फोन चयन करना होगा। यदि आप केवल इसे एक बार कॉल करना चाहते हैं, तो इसे केवल एक कॉल करें।

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