2011-10-02 16 views
8

में एक्सएमएल डेटा को सारांशित करना मैं एक्सएसएल और एक्सएमएल के लिए बहुत नया हूं और मुझे आशा है कि, एक आसान सवाल है। मेरे पास एक एक्सएमएल फ़ाइल है जिसमें संख्याओं के दो सरणी हैं जिन्हें मुझे योग करने की आवश्यकता है। यहाँ एक्सएमएल फ़ाइल का हिस्सादो एरे

<?xml version="1.0" encoding="UTF-8"?> 
<out_xml> 
<Root> 
    <ItemCollection> 
     <Item name="BaseLineOffSet" type="2"> 
      <Histogram> 
       <DispOrder>This is Order</DispOrder> 
       <IntensityArray> 
        <Intensity>105.84667205810547</Intensity> 
        <Intensity>105.83854675292969</Intensity> 
        <Intensity>105.57729339599609</Intensity> 
        <Intensity>105.66104888916016</Intensity> 
        <Intensity>105.56392669677734</Intensity> 
        <Intensity>105.33917236328125</Intensity> 
        <Intensity>105.33854675292969</Intensity> 
        <Intensity>105.31544494628906</Intensity> 
        <Intensity>105.40036010742187</Intensity> 
        <Intensity>105.21470642089844</Intensity> 
        <Intensity>105.14356994628906</Intensity> 
        <Intensity>104.92792510986328</Intensity> 
        <Intensity>104.93791961669922</Intensity> 
        <Intensity>104.93979644775391</Intensity> 
        <Intensity>104.96470642089844</Intensity> 
        <Intensity>105.01107025146484</Intensity> 
        <Intensity>104.76479339599609</Intensity> 
        <Intensity>104.9085693359375</Intensity> 
        <Intensity>104.70166778564453</Intensity> 
        <Intensity>104.75499725341797</Intensity> 
        <Intensity>104.77352905273437</Intensity> 
        <Intensity>104.77714538574219</Intensity> 
        <Intensity>104.59485626220703</Intensity> 
        <Intensity>104.44922</Intensity> 
        <Intensity>104.35479736328125</Intensity> 
        <Intensity>104.56911468505859</Intensity> 
        <Intensity>104.38999938964844</Intensity> 
        <Intensity>104.30992889404297</Intensity> 
        <Intensity>104.37964630126953</Intensity> 
       </IntensityArray> 
      </Histogram> 
     </Item> 
     <Item name="DispIntervalsMaxValues" type="2"> 
      <Histogram> 
       <DispOrder>This is Order</DispOrder> 
       <IntensityArray> 
        <Intensity>1.0229243040084839</Intensity> 
        <Intensity>48.868541717529297</Intensity> 
        <Intensity>47.504795074462891</Intensity> 
        <Intensity>162.17105102539062</Intensity> 
        <Intensity>91.323570251464844</Intensity> 
        <Intensity>44.405426025390625</Intensity> 
        <Intensity>51.243541717529297</Intensity> 
        <Intensity>131.44705200195312</Intensity> 
        <Intensity>2.8496425151824951</Intensity> 
        <Intensity>21.435295104980469</Intensity> 
        <Intensity>47.006423950195312</Intensity> 
        <Intensity>0.72917240858078003</Intensity> 
        <Intensity>46.669178009033203</Intensity> 
        <Intensity>83.804801940917969</Intensity> 
        <Intensity>44.197799682617187</Intensity> 
        <Intensity>32.138923645019531</Intensity> 
        <Intensity>30.30479621887207</Intensity> 
        <Intensity>58.928920745849609</Intensity> 
        <Intensity>29.930421829223633</Intensity> 
        <Intensity>38.282505035400391</Intensity> 
        <Intensity>30.801467895507813</Intensity> 
        <Intensity>43.710361480712891</Intensity> 
        <Intensity>38.167644500732422</Intensity> 
        <Intensity>27.842643737792969</Intensity> 
        <Intensity>34.102294921875</Intensity> 
        <Intensity>61.118381500244141</Intensity> 
        <Intensity>10.910002708435059</Intensity> 
        <Intensity>3.6150767803192139</Intensity> 
        <Intensity>3.1703603267669678</Intensity> 
       </IntensityArray> 
      </Histogram> 
     </Item> 
    </ItemCollection> 
</Root> 
</out_xml> 

क्या मैं सच में चाहते हैं दो तीव्रता सरणियों से तत्वों अप जोड़े जाने के लिए की राशि है। तो यह कुछ इस तरह होगा:

FirstArray [0] + SecondArray [0] = योग [0] जो वास्तव में

105,84667205810547 + 1,0229243040084839 = 106,8696 और

है

FirstArray [1] + SecondArray [1] = राशि [1]

105.83854675292969+ 48,868541717529297 = 154,7071 और इतने पर ...

इन दो कि मैं अब के लिए उपेक्षा करने की आवश्यकता के बीच में कुछ अन्य आइटम हैं।

धन्यवाद!

उत्तर

2

अपडेट किया गया:

पर sum देखो समारोह, उदा .:

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

    <xsl:key name="k" match="Intensity" use="count(preceding-sibling::Intensity)"/> 

    <xsl:template match="/"> 
    <root> 
     <xsl:apply-templates select="//Intensity[generate-id(.) = 
          generate-id(key('k', count(preceding-sibling::Intensity)))]"/> 
    </root> 
    </xsl:template> 

    <xsl:template match="Intensity"> 
    <sum> 
     <xsl:value-of select="sum(key('k', count(preceding-sibling::Intensity)))"/> 
    </sum> 
    </xsl:template> 

</xsl:stylesheet> 

इस टेम्पलेट दोनों IntensityArray के लिए Intensity तत्वों का योग।

आउटपुट:

<root> 
    <sum>106.86959636211395</sum> 
    <sum>154.70708847045898</sum> 
    <sum>153.08208847045898</sum> 
    <sum>267.8320999145508</sum> 
    <sum>196.8874969482422</sum> 
    <sum>149.74459838867187</sum> 
    <sum>156.58208847045898</sum> 
    <sum>236.7624969482422</sum> 
    <sum>108.25000262260437</sum> 
    <sum>126.6500015258789</sum> 
    <sum>152.14999389648437</sum> 
    <sum>105.65709751844406</sum> 
    <sum>151.60709762573242</sum> 
    <sum>188.74459838867187</sum> 
    <sum>149.16250610351562</sum> 
    <sum>137.14999389648437</sum> 
    <sum>135.06958961486816</sum> 
    <sum>163.8374900817871</sum> 
    <sum>134.63208961486816</sum> 
    <sum>143.03750228881836</sum> 
    <sum>135.5749969482422</sum> 
    <sum>148.48750686645508</sum> 
    <sum>142.76250076293945</sum> 
    <sum>132.5749969482422</sum> 
    <sum>138.45709228515625</sum> 
    <sum>165.68749618530273</sum> 
    <sum>115.3000020980835</sum> 
    <sum>107.92500567436218</sum> 
    <sum>107.5500066280365</sum> 
</root> 
+0

हाय किरिल:

नीचे एक समाधान FXSL 2 का उपयोग कर रहा है। मुझे प्रत्येक तत्व की योग की आवश्यकता है, न कि संपूर्ण सरणी। तो 105.8466721 + 1.022924304 फिर 105.8385468 + 48.86854172 आदि ... – user918967

+0

@ user918967, मैंने अपना जवाब अपडेट कर दिया है। –

+0

@downvoter, टिप्पणी करने के लिए देखभाल? –

2

निम्नलिखित क्या आप इसे करने की आवश्यकता है करता है?

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

    <xsl:template match="/"> 
    <root> 
     <xsl:apply-templates select="//ItemCollection"/> 
    </root> 
    </xsl:template> 

    <xsl:template match="ItemCollection"> 
    <xsl:variable name="itemCollection" select="." /> 
    <xsl:variable name="itemsCount" select="count((.//IntensityArray)[1]//Intensity)" /> 

    <xsl:for-each select="1 to $itemsCount"> 
     <xsl:variable name="itemIndex" select="." /> 
     <sum position="{$itemIndex}"> 
     <xsl:value-of select="sum($itemCollection//IntensityArray//Intensity[$itemIndex])" /> 
     </sum> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

मैं जब मैं अपने नमूना डेटा पर दौड़ा निम्नलिखित उत्पादन मिल गया:

<root> 
    <sum position="1">106.86959636211395</sum> 
    <sum position="2">154.70708847045898</sum> 
    <sum position="3">153.08208847045898</sum> 
    <sum position="4">267.8320999145508</sum> 
    <sum position="5">196.8874969482422</sum> 
    <sum position="6">149.74459838867187</sum> 
    <sum position="7">156.58208847045898</sum> 
    <sum position="8">236.7624969482422</sum> 
    <sum position="9">108.25000262260437</sum> 
    <sum position="10">126.6500015258789</sum> 
    <sum position="11">152.14999389648437</sum> 
    <sum position="12">105.65709751844406</sum> 
    <sum position="13">151.60709762573242</sum> 
    <sum position="14">188.74459838867187</sum> 
    <sum position="15">149.16250610351562</sum> 
    <sum position="16">137.14999389648437</sum> 
    <sum position="17">135.06958961486816</sum> 
    <sum position="18">163.8374900817871</sum> 
    <sum position="19">134.63208961486816</sum> 
    <sum position="20">143.03750228881836</sum> 
    <sum position="21">135.5749969482422</sum> 
    <sum position="22">148.48750686645508</sum> 
    <sum position="23">142.76250076293945</sum> 
    <sum position="24">132.5749969482422</sum> 
    <sum position="25">138.45709228515625</sum> 
    <sum position="26">165.68749618530273</sum> 
    <sum position="27">115.3000020980835</sum> 
    <sum position="28">107.92500567436218</sum> 
    <sum position="29">107.5500066280365</sum> 
</root> 
+0

हाय ल्यूक, एडिटएक्स 2010 में अपना कोड चलाना मुझे अभिव्यक्ति 1 से $ आइटम्स में निम्न त्रुटि मिली है: अनपेक्षित टोकन के अंत से परे अभिव्यक्ति – user918967

+0

विषम, यह सैक्सन में मेरे लिए ठीक काम करता है। चूंकि EditiX 2010 स्पष्ट रूप से XPath 2.0 का समर्थन करता है, क्या यह आपकी मदद करता है यदि आप ' 'तत्व'' ™' के 'संस्करण' विशेषता को बदलते हैं? –

+0

हाय ल्यूक - हाँ, जिसने चाल की थी! – user918967

1

यह परिवर्तन प्रवाल मालाएं में भी वांछित परिणाम पैदा करता है दो नोड सेट नोड्स के विभिन्न संख्या है और/

<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:variable name="vArr1" select= 
    "/*/*/*/Item[1]/*/IntensityArray/*"/> 
<xsl:variable name="vArr2" select= 
    "/*/*/*/Item[2]/*/IntensityArray/*"/> 

<xsl:variable name="vShorterArr" select= 
    "$vArr1[not(count($vArr1) > count($vArr2))] 
    | 
    $vArr2[not(count($vArr2) >= count($vArr1))] 
    "/> 

<xsl:variable name="vLongerArr" select= 
    "$vArr2[not(count($vArr1) > count($vArr2))] 
    | 
    $vArr1[not(count($vArr2) >= count($vArr1))] 
    "/> 

<xsl:template match="/"> 
    <summedIntensities> 
     <xsl:apply-templates select="$vLongerArr"/> 
    </summedIntensities> 
</xsl:template> 

<xsl:template match="Intensity"> 
    <xsl:variable name="vPos" select="position()"/> 
    <Intensity> 
    <xsl:variable name="vVal2" select="$vShorterArr[position()=$vPos]"/> 
    <xsl:value-of select= 
    ". 
    + 
     concat('0', 
      substring($vVal2, 
         1 div (number($vVal2) = number($vVal2)) 
         ) 
      ) 
    "/> 
    </Intensity> 
</xsl:template> 
</xsl:stylesheet> 

जब टी: या 2 नोड सेट में नोड्स के कुछ मूल्य है कि एक नंबर को castable है की जरूरत नहीं है उनके परिवर्तन को निम्नलिखित XML दस्तावेज़ पर लागू किया गया है (प्रदान किए गए एक जैसा ही है, लेकिन पहले नोड-सेट में जोड़ा गया है और दो नोड-सेट आकार में अलग करने के लिए एक और Intensity तत्व (अंतिम एक) सेट करें):

<out_xml> 
    <Root> 
     <ItemCollection> 
      <Item name="BaseLineOffSet" type="2"> 
       <Histogram> 
        <DispOrder>This is Order</DispOrder> 
        <IntensityArray> 
         <Intensity>105.84667205810547</Intensity> 
         <Intensity>105.83854675292969</Intensity> 
         <Intensity>105.57729339599609</Intensity> 
         <Intensity>105.66104888916016</Intensity> 
         <Intensity>105.56392669677734</Intensity> 
         <Intensity>105.33917236328125</Intensity> 
         <Intensity>105.33854675292969</Intensity> 
         <Intensity>105.31544494628906</Intensity> 
         <Intensity>105.40036010742187</Intensity> 
         <Intensity>105.21470642089844</Intensity> 
         <Intensity>105.14356994628906</Intensity> 
         <Intensity>104.92792510986328</Intensity> 
         <Intensity>104.93791961669922</Intensity> 
         <Intensity>104.93979644775391</Intensity> 
         <Intensity>104.96470642089844</Intensity> 
         <Intensity>105.01107025146484</Intensity> 
         <Intensity>104.76479339599609</Intensity> 
         <Intensity>104.9085693359375</Intensity> 
         <Intensity>104.70166778564453</Intensity> 
         <Intensity>104.75499725341797</Intensity> 
         <Intensity>104.77352905273437</Intensity> 
         <Intensity>104.77714538574219</Intensity> 
         <Intensity>104.59485626220703</Intensity> 
         <Intensity>104.44922</Intensity> 
         <Intensity>104.35479736328125</Intensity> 
         <Intensity>104.56911468505859</Intensity> 
         <Intensity>104.38999938964844</Intensity> 
         <Intensity>104.30992889404297</Intensity> 
         <Intensity>104.37964630126953</Intensity> 
         <Intensity>105.37964630126953</Intensity> 
        </IntensityArray> 
       </Histogram> 
      </Item> 
      <Item name="DispIntervalsMaxValues" type="2"> 
       <Histogram> 
        <DispOrder>This is Order</DispOrder> 
        <IntensityArray> 
         <Intensity>1.0229243040084839</Intensity> 
         <Intensity>48.868541717529297</Intensity> 
         <Intensity>47.504795074462891</Intensity> 
         <Intensity>162.17105102539062</Intensity> 
         <Intensity>91.323570251464844</Intensity> 
         <Intensity>44.405426025390625</Intensity> 
         <Intensity>51.243541717529297</Intensity> 
         <Intensity>131.44705200195312</Intensity> 
         <Intensity>2.8496425151824951</Intensity> 
         <Intensity>21.435295104980469</Intensity> 
         <Intensity>47.006423950195312</Intensity> 
         <Intensity>0.72917240858078003</Intensity> 
         <Intensity>46.669178009033203</Intensity> 
         <Intensity>83.804801940917969</Intensity> 
         <Intensity>44.197799682617187</Intensity> 
         <Intensity>32.138923645019531</Intensity> 
         <Intensity>30.30479621887207</Intensity> 
         <Intensity>58.928920745849609</Intensity> 
         <Intensity>29.930421829223633</Intensity> 
         <Intensity>38.282505035400391</Intensity> 
         <Intensity>30.801467895507813</Intensity> 
         <Intensity>43.710361480712891</Intensity> 
         <Intensity>38.167644500732422</Intensity> 
         <Intensity>27.842643737792969</Intensity> 
         <Intensity>34.102294921875</Intensity> 
         <Intensity>61.118381500244141</Intensity> 
         <Intensity>10.910002708435059</Intensity> 
         <Intensity>3.6150767803192139</Intensity> 
         <Intensity>3.1703603267669678</Intensity> 
        </IntensityArray> 
       </Histogram> 
      </Item> 
     </ItemCollection> 
    </Root> 
</out_xml> 

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

<summedIntensisites> 
    <Intensity>106.86959636211395</Intensity> 
    <Intensity>154.70708847045898</Intensity> 
    <Intensity>153.08208847045898</Intensity> 
    <Intensity>267.8320999145508</Intensity> 
    <Intensity>196.8874969482422</Intensity> 
    <Intensity>149.74459838867188</Intensity> 
    <Intensity>156.58208847045898</Intensity> 
    <Intensity>236.7624969482422</Intensity> 
    <Intensity>108.25000262260437</Intensity> 
    <Intensity>126.6500015258789</Intensity> 
    <Intensity>152.14999389648438</Intensity> 
    <Intensity>105.65709751844406</Intensity> 
    <Intensity>151.60709762573242</Intensity> 
    <Intensity>188.74459838867188</Intensity> 
    <Intensity>149.16250610351562</Intensity> 
    <Intensity>137.14999389648438</Intensity> 
    <Intensity>135.06958961486816</Intensity> 
    <Intensity>163.8374900817871</Intensity> 
    <Intensity>134.63208961486816</Intensity> 
    <Intensity>143.03750228881836</Intensity> 
    <Intensity>135.5749969482422</Intensity> 
    <Intensity>148.48750686645508</Intensity> 
    <Intensity>142.76250076293945</Intensity> 
    <Intensity>132.5749969482422</Intensity> 
    <Intensity>138.45709228515625</Intensity> 
    <Intensity>165.68749618530273</Intensity> 
    <Intensity>115.3000020980835</Intensity> 
    <Intensity>107.92500567436218</Intensity> 
    <Intensity>107.5500066280365</Intensity> 
    <Intensity>105.37964630126953</Intensity> 
</summedIntensisites> 

स्पष्टीकरण:

  1. दो चर परिभाषित किए गए हैं, प्रत्येक में नोड्स हैं जो "सरणी" को संकलित करते हैं।

  2. एक और दो चर परिभाषित किए गए हैं: $vShorterArr, जिसमें छोटे नोड-सेट और $vLongerArr युक्त लंबे नोड-सेट होते हैं।

  3. टेम्पलेट लंबे नोड-सेट पर लागू होते हैं।

  4. लंबे नोड-सेट में प्रत्येक नोड को छोटे नोड-सेट में, या 0 के साथ संबंधित (यदि ऐसा मौजूद है) नोड के साथ सम्मिलित किया जाता है।

II। XSLT 2.0 समाधान:

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

<xsl:variable name="vArr1" select= 
    "/*/*/*/Item[1]/*/IntensityArray/*/number()"/> 
<xsl:variable name="vArr2" select= 
    "/*/*/*/Item[2]/*/IntensityArray/*/number()"/> 

<xsl:variable name="vShorterArr" select= 
    "if(count($vArr1) lt count($vArr2)) 
    then $vArr1 
    else $vArr2 
    "/> 
<xsl:variable name="vLongerArr" select= 
    "if(count($vArr1) ge count($vArr2)) 
    then $vArr1 
    else $vArr2 
    "/> 

<xsl:template match="/"> 
    <summedIntensities> 
     <xsl:for-each select="$vLongerArr"> 
      <xsl:variable name="vPos" select="position()"/> 
      <Intensity> 
      <xsl:variable name="vVal2" select= 
       "$vShorterArr[$vPos]"/> 
      <xsl:sequence select= 
      ". 
      + 
       (if($vVal2 castable as xs:double) 
       then $vVal2 
       else 0 
       ) 
      "/> 
      </Intensity> 
     </xsl:for-each> 
    </summedIntensities> 
</xsl:template> 
</xsl:stylesheet> 

तृतीय। FXSL का उपयोग करना:

यह बहुत आसान है FXSL की f:zip-with() समारोह/टेम्पलेट का उपयोग कर इस समस्या को हल करने के लिए। मुझे लगता है मैं स्पष्ट नहीं था -

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:f="http://fxsl.sf.net/" 
exclude-result-prefixes="f" 
> 
    <xsl:import href="../f/func-zipWithDVC.xsl"/> 
    <xsl:import href="../f/func-Operators.xsl"/> 

    <!-- To be applied on numList.xml --> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
    <summedIntensities> 
     <xsl:for-each select= 
     "f:zipWith(f:add(), 
       /*/*/*/Item[1]/*/IntensityArray/*/number(), 
       /*/*/*/Item[2]/*/IntensityArray/*/number() 
       )" 
     > 
     <Intensity> 
     <xsl:sequence select="."/> 
     </Intensity> 
     </xsl:for-each> 
    </summedIntensities> 
    </xsl:template> 
</xsl:stylesheet> 
+0

मेरा सच्चा एक्सएमएल दस्तावेज़ काफी जटिल है। ऐसे कई रन थे जो सरणी के जोड़े उत्पन्न करते हैं जिन्हें मुझे योग करने की आवश्यकता होती है। क्या यह सब प्रत्येक लूप के लिए घोंसला हो सकता है? – user918967

+0

@ user918967: 'xsl: for-प्रत्येक' की कोई आवश्यकता नहीं है, बस अपने फ़ंक्शन 'ज़िप-साथ() 'का उपयोग करें, या FXSL द्वारा प्रदान किए गए किसी का उपयोग करें। –

+0

मैं कोड को फिर से देख रहा था और डिमिट्रे मुझे लगता है कि जब आप आइटम नाम = "बेसलाइनऑफसेट" और आइटम नाम = "डिस्पइंटरवॉलमैक्सवेल" नामक तीव्रता सरणी की एक जोड़ी ढूंढ रहे हैं और सभी तीव्रता सरणी को अनदेखा कर रहे हैं, तो मेरा उपयोग करना आसान है। Dmimitre, मैं केवल दो दो सरणी प्राप्त करने के लिए चर कैसे बदलूँगा? – user918967

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