2012-05-03 24 views
13

से चर के साथ बाहरी तत्व तक पहुंचने के लिए मैं एक एक्सएसएल लिखने की कोशिश कर रहा हूं जो स्रोत एक्सएमएल से फ़ील्ड के एक निश्चित सबसेट को आउटपुट करेगा। यह सबसेट ट्रांसफ़ॉर्मेशन समय पर निर्धारित किया जाएगा, बाहरी नाम कॉन्फ़िगरेशन दस्तावेज़ का उपयोग करके फ़ील्ड नाम, और अन्य विशिष्ट जानकारी (जैसे पैडिंग लम्बाई)। रिकॉर्ड से अपने खेतों रिकॉर्ड तक पहुँचने के लिएप्रत्येक लूप के लिए नेस्टेड, आंतरिक लूप

  • अधिक रिकॉर्ड बाहरी एक दोहराता:

    तो, यह दो for-each छोरों है।

  • आंतरिक रिकॉर्ड कॉन्फ़िगरेशन फ़ील्ड को वर्तमान रिकॉर्ड से कॉन्फ़िगर करने के लिए कॉन्फ़िगरेशन XML दस्तावेज़ पर पुनरावृत्त करता है।

मैं In XSLT how do I access elements from the outer loop from within nested loops? में देखा है कि बाहर पाश में वर्तमान तत्व एक xsl:variable में संग्रहित किया जा सकता है। लेकिन फिर मुझे फ़ील्ड नाम प्राप्त करने के लिए आंतरिक लूप के अंदर एक नया चर परिभाषित करना होगा। प्रश्न के लिए कौन सा उपज: क्या किसी पथ को एक्सेस करना संभव है जिसमें दो चर हैं?

उदाहरण के लिए, स्रोत XML दस्तावेज़ लगता है:

<configuration> 
    <outputField order="1"> 
     <fieldName>field1</fieldName> 
     <fieldPadding>25</fieldPadding> 
    </outputField> 
    ... 
    <outputField order="N"> 
     <fieldName>fieldN</fieldName> 
     <fieldPadding>10</fieldPadding> 
    </outputField> 
</configuration> 

XSL मैं अब तक मिल गया है:

<data> 
    <dataset> 
     <record> 
      <field1>value1</field1> 
      ... 
      <fieldN>valueN</fieldN> 
     </record> 
    </dataset> 
    <dataset> 
     <record> 
      <field1>value1</field1> 
      ... 
      <fieldN>valueN</fieldN> 
     </record> 
    </dataset> 
</data> 

मैं की तरह लग रही एक बाहरी एक्सएमएल फ़ाइल करना चाहते हैं:

<xsl:variable name="config" select="document('./configuration.xml')"/> 
<xsl:for-each select="data/dataset/record"> 
    <!-- Store the current record in a variable --> 
    <xsl:variable name="rec" select="."/> 
    <xsl:for-each select="$config/configuration/outputField"> 
     <xsl:variable name="field" select="fieldName"/> 
     <xsl:variable name="padding" select="fieldPadding"/> 

     <!-- Here's trouble --> 
     <xsl:variable name="value" select="$rec/$field"/> 

     <xsl:call-template name="append-pad"> 
      <xsl:with-param name="padChar" select="$padChar"/> 
      <xsl:with-param name="padVar" select="$value"/> 
      <xsl:with-param name="length" select="$padding"/> 
     </xsl:call-template> 

    </xsl:for-each> 
    <xsl:value-of select="$newline"/> 
</xsl:for-each> 

मैं काफी XSL के लिए नया हूँ, इसलिए यह अच्छी तरह से एक हास्यास्पद सवाल हो सकता है, और दृष्टिकोण भी सादा wro हो सकता है एनजी (यानी एक कार्य के लिए आंतरिक लूप दोहराएं जो भिखारी पर एक बार किया जा सकता है)। मैं बाहरी लूप तत्व से फ़ील्ड मान का चयन करने के तरीके के बारे में किसी भी सुझाव की सराहना करता हूं और, ज़ाहिर है, इस कार्य को पूरा करने के बेहतर तरीके से खोलें।

उत्तर

13

आपकी स्टाइलशीट लगभग ठीक दिखती है। बस अभिव्यक्ति $rec/$field समझ में नहीं आता है क्योंकि आप इस तरह दो नोड सेट/अनुक्रमों को गठबंधन नहीं कर सकते हैं। इसके बजाय, आपको name() फ़ंक्शन का उपयोग करके तत्वों के नामों की तुलना करनी चाहिए। अगर मैं आपकी समस्या को सही ढंग से समझ में आया, कुछ इस तरह काम करना चाहिए:

<xsl:variable name="config" select="document('./configuration.xml')"/> 
<xsl:for-each select="data/dataset/record"> 
    <xsl:variable name="rec" select="."/> 
    <xsl:for-each select="$config/configuration/outputField"> 
     <xsl:variable name="field" select="fieldName"/> 
     ... 
     <xsl:variable name="value" select="$rec/*[name(.)=$field]"/> 
     ...  
    </xsl:for-each> 
    <xsl:value-of select="$newline"/> 
</xsl:for-each> 

चर क्षेत्र इस उदाहरण में आवश्यक नहीं है। आप आंतरिक लूप के वर्तमान संदर्भ नोड तक पहुंचने के लिए फ़ंक्शन current() का उपयोग भी कर सकते हैं:

<xsl:variable name="value" select="$rec/*[name(.)=current()/fieldName]"/> 
संबंधित मुद्दे