2009-01-17 6 views
20

मैं XSL नेस्ट हैमैं बाहरी लूप से तत्वों को नेस्टेड लूप के भीतर से कैसे एक्सेस करूं? छोरों के लिए:

<xsl:for-each select="/Root/A"> 
    <xsl:for-each select="/Root/B"> 
     <!-- Code --> 
    </xsl:for> 
</xsl:for> 

भीतरी पाश के भीतर से, मैं कैसे बाहरी पाश में वर्तमान नोड से विशेषताओं का उपयोग कर सकते हैं? के रूप में कभी कभी मैं सूचना के कई टुकड़े का उपयोग और प्रत्येक टुकड़े के लिए एक चर बनाने खत्म करने की जरूरत है

<xsl:for-each select="/Root/A"> 
    <xsl:variable name="someattribute" select="@SomeAttribute"/> 
    <xsl:for-each select="/Root/B"> 
     <!-- Now can use $someattribute to access data from 'A' --> 
    </xsl:for> 
</xsl:for> 

यह बहुत अच्छी तरह से स्केल नहीं करता है,:

मैं अपने आप को इस तरह कोड लिखने ढूंढ पाएं। क्या कोई आसान तरीका है?

उत्तर

26

आप एक चर में संपूर्ण/रूट/ए संरचना को स्टोर कर सकते हैं, और उस विशेषता को संदर्भित कर सकते हैं जो प्रत्येक विशेषता और उपखंड के लिए एक नया चर बनाने के बजाय आपको उपयोग करने की आवश्यकता है।

<xsl:for-each select="/Root/A/"> 
    <xsl:variable name="ROOT_A" select="."/> 
    <xsl:for-each select="/Root/B/"> 
     <!-- Variable is accessed like this: $ROOT_A/@someAttribute 
       Just like a normal XML node --> 
    </xsl:for-each> 
</xsl:for-each> 
+0

+1, लेकिन यह संपादन चर नाम के लायक अपने कार्य को और अधिक स्पष्ट करने के लिए हो सकता है । – AnthonyWJones

+0

हो गया। इनपुट के लिए धन्यवाद। – Welbog

+0

यही वह है जो मैं आमतौर पर कर रहा हूं ;-p –

8

Welbog यह अच्छी तरह से उत्तर दिया - लेकिन सिर्फ तुम एक cartesion (क्रॉस) कर रही होना दिखाई देते हैं में शामिल होने के नोट करने के लिए - कि जानबूझकर है? तुम क्या करने की कोशिश कर रहे हैं, तो एक नियमित रूप से शामिल होने के, तो आप <xsl:key/> में देखना चाहते हैं करना चाहते हैं (एक विधेय आदि के साथ) - यानी एक प्रमुख घोषित:

<xsl:key name="BIndex" match="/Root/B" use="SomeChildNode"/> 

फिर अपने विधेय में उपभोग:

<xsl:for-each select="/Root/A/"> 
    <xsl:variable name="ROOT_A" select="."/> 
    <xsl:for-each select="key('BIndex', LocalNode)"> 
    <!-- --> 
    </xsl:for-each> 
</xsl:for-each> 

इस के बराबर (लेकिन तुलना में बहुत तेजी से) होना चाहिए विधेय:

<xsl:for-each select="/Root/B[SomeChildNode = current()/LocalNode]"> 

यदि आप हैं डेटा समूहीकरण, तो ०१२३२१६०५००५ को देखो

+0

युक्तियों के लिए धन्यवाद .. मैं एक्सएसएलटी के लिए अपेक्षाकृत नया हूं और पूरी तरह से सुनिश्चित नहीं हूं कि मैं अभी तक क्या कर रहा हूं। एक बार जब मैं चीजें काम कर लेता हूं तो मैं यह देखने के लिए सुझाव देता हूं कि क्या एक आसान तरीका है या नहीं। – pauldoo

+0

नोट: मुझे उपरोक्त 'कार्टेशियन-जॉइन बनाम predicate-join part' को समझने के लिए कुछ प्रयास किया। तो बस नए लोगों के लिए अंतर को ध्यान में रखते हुए। असल में यदि आपके पास बी में नोड्स की संख्या और 'एन' संख्या में नोड्स की संख्या है, तो कार्टेशियन जॉइन के परिणामस्वरूप एम * एन नोड्स होंगे, जबकि भविष्य में शामिल हों- किसी विशेष कुंजी पर शामिल हों यानी ए और बी में शामिल हों। कुंजी = बीकी। – GuruM

+0

वर्तमान के तत्व नाम (तत्व के लिए फॉर-लूप पुनरावृत्त) के खिलाफ जांचने के लिए, आप 'name (current()) 'का उपयोग कर सकते हैं -' वर्तमान()/name()' की कोशिश न करें, इसकी अनुमति नहीं है। – CoDEmanX

0

निम्नलिखित का भी इस्तेमाल किया जा सकता है:

<xsl:for-each select="ns:attribute"> 
     <name><xsl:value-of select="ns:name" /></name>    
     <xsl:for-each select="ns:value"> 
     <value><xsl:value-of select="."/></value>  
     </xsl:for-each> 
    </xsl:for-each>  

XML दस्तावेज़ पार्स करने के लिए ..

<ns:attribute> 
     <ns:name>name</ns:name> 
     <!--1 or more repetitions:--> 
     <ns:value>Rahul</ns:value> 
     <ns:value>Sushovan</ns:value> 
</ns:attribute> 
संबंधित मुद्दे