2012-08-24 11 views
5

बदल रहा है इस कोड उदाहरण में मुझे बी नोड के बाद बी 1 नोड सेट करने और नोड सी, डी और ई के पहले 2 चुनौतियों का सामना करना है और दूसरी चुनौती है दूसरे कुंजी नोड को/रूट/ई/अन्य/डील/कुंजी संरचना में जोड़ें।एकाधिक टेम्पलेट परिभाषाओं को कैसे लागू करें जहां उनमें से प्रत्येक एक ही एक्सएमएल संरचना

इस एक्सएमएल नमूना:

 <ROOT> 
      <A>some A text</A> 
      <B>some B text</B> 
      <C>some C text</C> 
      <D>some D text</D> 
      <E> 
      <OTHER> 
       <DEAL> 
       <KEYS> 
        <KEY> 
        <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType> 
        <KeyValue>123456|1</KeyValue> 
        </KEY> 
       </KEYS> 
       </DEAL> 
      </OTHER> 
      </E> 
     </ROOT> 

परिवर्तन के बाद:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <xsl:strip-space elements="*"/> 
     <xsl:output method="xml" indent="yes"/> 

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

     <!-- Identifiers are added by the system. Need to pass parms from the calling program --> 
     <xsl:template match="ROOT" name="add-B1"> 
      <xsl:variable name="elements-after" select="C|D|E"/> 
      <xsl:copy> 
       <xsl:copy-of select="* except $elements-after"/> 
       <B1>some B1 text</B1> 
       <xsl:copy-of select="$elements-after"/> 
      </xsl:copy> 
     </xsl:template> 

     <!-- KEY is added by the system. Need to pass parms from the calling program --> 
     <xsl:template match="ROOT/E/OTHER/DEAL/KEYS" name="add-KEYS"> 
      <xsl:param name="KeyIdentifierTypeB">654321|1</xsl:param> 
      <xsl:copy> 
       <xsl:copy-of select="*"/> 
       <KEY> 
        <KeyIdentifierType>KeyIdentifierTypeB</KeyIdentifierType> 
        <KeyValue> 
         <xsl:value-of select="$KeyIdentifierTypeB"/> 
        </KeyValue> 
       </KEY> 
      </xsl:copy> 
     </xsl:template> 
    </xsl:stylesheet> 

बन:

 <?xml version="1.0" encoding="UTF-8"?> 
     <ROOT> 
      <A>some A text</A> 
      <B>some B text</B> 
      <B1 xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">some B1 text</B1> 
      <C>some C text</C> 
      <D>some D text</D> 
      <E> 
       <OTHER> 
        <DEAL> 
         <KEYS> 
          <KEY> 
           <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType> 
           <KeyValue>123456|1</KeyValue> 
          </KEY> 
         </KEYS> 
        </DEAL> 
       </OTHER> 
      </E> 
     </ROOT> 

क्यों दूसरा टेम्पलेट परिभाषा पूरी तरह से नजरअंदाज कर दिया गया?

पहला कोड कॉलेज हल किया गया है बी 1 नोड बी नोड के बाद और नोड सी, डी और ई के पहले सेट किया गया है या दूसरे शब्दों में बी 1 नोड सेट है और नोड्स के बाद यह होना चाहिए: सी, डी और ई
दूसरा टेम्पलेट मैच = "रूट/ई/अन्य/डील/कुंजी" जो दूसरे चुनौती भाग को पूरा करना चाहिए: दूसरे कुंजी नोड को/रूट/ई/अन्य/डीईएल/कुंजी संरचना में जोड़ने के लिए, अनदेखा कर दिया गया है पूरी तरह। इस तथ्य के अतिरिक्त, यदि आप रूट नोड पर पहले टेम्पलेट मैच पर टिप्पणी करते हैं, तो दूसरा टेम्पलेट मैच = "रूट/ई/अन्य/डील/कुंजी" सही तरीके से काम करेगा, यह वास्तव में अतिरिक्त कुंजी जोड़ देगा, लेकिन मैं नहीं करता पता नहीं क्यों पहला टेम्पलेट मैच हमेशा दूसरे को ओवरराइड करता है। मैं xsl आज़माता हूं: टेम्पलेट मैच = "रूट/ई/अन्य/सौदा/कुंजी ... और xsl: प्रत्येक-चयन = ... और xsl: कॉल-टेम्पलेट नाम =" ऐड-कुंजियां "लेकिन कुछ भी मेरी मदद नहीं करता आउट

मैं वास्तव में समझता हूं कि लागू टेम्पलेट्स उच्चतम प्राथमिकता वाले उच्च ढांचे वाले नोड्स टेम्पलेट्स से मेल खाते हैं। एक्सएसएलटी फ़ाइल में टेम्पलेट स्थान बदलने से कोई प्रभाव नहीं पड़ेगा, यह इसके बजाय सटीक रेखा अनुक्रम में नहीं पढ़ेगा यह प्राथमिकता से मेल खाने से इसे संसाधित करेगा। प्रत्येक मिलान करने वाले टेम्पलेट के लिए "लागू-टेम्पलेट्स" एक्सएमएल संरचना पर बदलाव करेगा, निश्चित रूप से यह हमारे लिए "प्रत्येक के लिए" बनाएगा, लेकिन मुझे "सलाह" कैसे नहीं है दूसरा टेम्पलेट जो संरचना बदल दी गई है, और मुझे ऐसा क्यों करना चाहिए, क्योंकि दूसरा टेम्पलेट मैच एक अलग XPath स्थान की तलाश में है, कि बीटीडब्ल्यू को पहले टेम्पलेट से कभी छुआ नहीं गया है। क्या मुझे टेम्पलेट sequencin लागू करना चाहिए मेरे मामले में जी? ... और यह कैसे करना है सबसे अच्छा अभ्यास क्या है?

अपेक्षित परिणाम:

 <?xml version="1.0" encoding="UTF-8"?> 
     <ROOT> 
      <A>some A text</A> 
      <B>some B text</B> 
      <B1>some B1 text</B1> 
      <C>some C text</C> 
      <D>some D text</D> 
      <E> 
       <OTHER> 
        <DEAL> 
         <KEYS> 
          <KEY> 
           <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType> 
           <KeyValue>123456|1</KeyValue> 
          </KEY> 
          <KEY> 
           <KeyIdentifierType>KeyIdentifierTypeB</KeyIdentifierType> 
           <KeyValue>654321|1</KeyValue> 
          </KEY> 
         </KEYS> 
        </DEAL> 
       </OTHER> 
      </E> 
     </ROOT> 

उत्तर

3

दूसरा टेम्पलेट match="ROOT/E/OTHER/DEAL/KEYS" कि दूसरी चुनौती भाग को पूरा करना चाहिए: /ROOT/E/OTHER/DEAL/KEYS संरचना करने के लिए दूसरी चाबी नोड जोड़ें, पूरी तरह से नजरअंदाज कर दिया गया।

समस्या यह है कि टेम्पलेट मिलान ROOT कोई xsl:apply-templates नहीं है। एक टेम्पलेट केवल xsl:apply-templates निर्देश के परिणामस्वरूप निष्पादन के लिए चुना जाता है। आपके कोड में कोई xsl:apply-templates नहीं है, इसलिए एक्सएसएलटी प्रोसेसर अब टेम्पलेट्स को लागू नहीं करता है और निष्पादन समाप्त करता है।

xsl:apply-templates के साथ बदलकर यह अलग होगा।

यहाँ कैसे करना है इस:

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

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

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|B/preceding-sibling::node()"/> 
    <xsl:apply-templates select="B"/> 
    <B1>some B1 text</B1> 
    <xsl:apply-templates select="B/following-sibling::node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="KEY"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    <KEY> 
    <KeyIdentifierType>KeyIdentifierTypeB</KeyIdentifierType> 
    <KeyValue> 
    <xsl:value-of select="'654321|1'"/> 
    </KeyValue> 
    </KEY> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

जब इस बदलाव प्रदान की XML दस्तावेज़ पर भी लागू होता है:

<ROOT> 
    <A>some A text</A> 
    <B>some B text</B> 
    <C>some C text</C> 
    <D>some D text</D> 
    <E> 
     <OTHER> 
      <DEAL> 
       <KEYS> 
        <KEY> 
         <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType> 
         <KeyValue>123456|1</KeyValue> 
        </KEY> 
       </KEYS> 
      </DEAL> 
     </OTHER> 
    </E> 
</ROOT> 

चाहता था, सही परिणाम उत्पादन किया जाता है:

<ROOT> 
    <A>some A text</A> 
    <B>some B text</B> 
    <B1>some B1 text</B1> 
    <C>some C text</C> 
    <D>some D text</D> 
    <E> 
     <OTHER> 
     <DEAL> 
      <KEYS> 
       <KEY> 
        <KeyIdentifierType>KeyIdentifierTypeA</KeyIdentifierType> 
        <KeyValue>123456|1</KeyValue> 
        <KEY> 
        <KeyIdentifierType>KeyIdentifierTypeB</KeyIdentifierType> 
        <KeyValue>654321|1</KeyValue> 
        </KEY> 
       </KEY> 
      </KEYS> 
     </DEAL> 
     </OTHER> 
    </E> 
</ROOT> 
+0

बहुत बहुत धन्यवाद! –

+0

@ user1619586, आपका स्वागत है। –

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

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