2013-06-03 67 views
-1

我需要在輸入XML下面轉換才能輸出XML。你能爲此提供任何想法嗎?XSLT轉換問題:從普通XML到多級XML

我需要在輸入XML下面轉換才能輸出XML。你能爲此提供任何想法嗎?

輸入XML:

<GenericCollection ParamValue="ParamValue1" xmlns="http://www.example.org"> 
    <Generic> 
    <store>Store1</store> 
    <metricName>Metric1</metricName> 
    <metricValue>1</metricValue> 
    </Generic> 
    <Generic> 
    <store>Store1</store> 
    <metricName>Metric2</metricName> 
    <metricValue>1</metricValue> 
    </Generic> 
    <Generic> 
    <store>Store2</store> 
    <metricName>Metric1</metricName> 
    <metricValue>1</metricValue> 
    </Generic> 
    <Generic> 
    <store>Store2</store> 
    <metricName>Metric1</metricName> 
    <metricValue>2</metricValue> 
    </Generic> 
    <Generic> 
    <store>Store2</store> 
    <metricName>Metric2</metricName> 
    <metricValue>1</metricValue> 
    </Generic> 
    <Generic> 
    <store>Store3</store> 
    <metricName>Metric1</metricName> 
    <metricValue>1</metricValue> 
    </Generic> 
    <Generic> 
    <store>Store3</store> 
    <metricName>Metric1</metricName> 
    <metricValue>2</metricValue> 
    </Generic> 
</GenericCollection> 

輸出:

<?xml version = '1.0' encoding = 'UTF-8'?> 
<ns4:EnterpriseDocument> 
    <ns4:DataSet> 
    <ns4:Dimension ref_name="bu_code" value="Store1"> 
     <ns4:Metric ref_name="Metric1"> 
     <ns4:Data value="1"/> 
     </ns4:Metric> 
     <ns4:Metric ref_name="Metric2"> 
     <ns4:Data value="1"/> 
     </ns4:Metric> 
    </ns4:Dimension> 
    <ns4:Dimension ref_name="bu_code" value="Store2"> 
     <ns4:Metric ref_name="Metric1"> 
     <ns4:Data value="1"/> 
     <ns4:Data value="2"/>    
     </ns4:Metric> 
     <ns4:Metric ref_name="Metric2"> 
     <ns4:Data value="1"/> 
     </ns4:Metric> 
    </ns4:Dimension> 
    <ns4:Dimension ref_name="bu_code" value="Store3"> 
     <ns4:Metric ref_name="Metric1"> 
     <ns4:Data value="1"/> 
     <ns4:Data value="2"/>    
     </ns4:Metric> 
    </ns4:Dimension>  
    </ns4:DataSet> 
</ns4:EnterpriseDocument> 
    Thanks, 
    Ramesh 
+0

這是張貼XML是正確的<在這裏你試圖讓所需的任何東西。輸出? –

+0

我試着直接發佈「<」,並且stackoverflow沒有接受它。我沒有太多的XSLT經驗。我正在使用Oracle BPEL XSLT,並且目前使用3 for-each循環來實現這一點。我想減少循環由於性能問題 – user2447671

+0

Oracle BPEL XSLT是否支持XSLT 2。 0? –

回答

0

如果你能使用XSLT 2.0,那麼你或許應該使用的xsl:for-各組這裏,而不是xsl:for-each,因爲您試圖在此處對元素進行分組。

首先你被通用元素分組通過值,所以你會寫這個。

<xsl:for-each-group select="Generic" group-by="store"> 

然後在此,你會輸出* 尺寸*爲集團像這樣元素:

<Dimension ref_name="bu_code" value="{current-grouping-key()}"> 

下一步,要進一步組該組中的元素通過其metricName

<xsl:for-each-group select="current-group()" group-by="metricName"> 

注意使用電流組的()這裏。您只是遍歷當前「存儲」組中的元素,而不是遍歷所有通用元素。

最後,輸出所有的數據元素,你可以這樣做

<xsl:for-each select="current-group()"> 

試試下面的XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="http://www.example.org"> 

<xsl:output method="xml" indent="yes" /> 

<xsl:template match="/*"> 
    <EnterpriseDocument> 
    <DataSet> 
     <xsl:for-each-group select="Generic" group-by="store"> 
     <Dimension ref_name="bu_code" value="{current-grouping-key()}"> 
      <xsl:for-each-group select="current-group()" group-by="metricName"> 
       <Metric ref_name="{current-grouping-key()}"> 
        <xsl:for-each select="current-group()"> 
        <Data value="{metricValue}"/> 
        </xsl:for-each> 
       </Metric> 
      </xsl:for-each-group> 
     </Dimension> 
     </xsl:for-each-group> 
    </DataSet> 
    </EnterpriseDocument> 
</xsl:template> 

</xsl:stylesheet> 

當你的XML樣本運行,下面是輸出(注,在我的示例中,我不包含任何命名空間,只是爲了清晰起見)

<EnterpriseDocument> 
    <DataSet> 
     <Dimension ref_name="bu_code" value="Store1"> 
     <Metric ref_name="Metric1"> 
      <Data value="1"/> 
     </Metric> 
     <Metric ref_name="Metric2"> 
      <Data value="1"/> 
     </Metric> 
     </Dimension> 
     <Dimension ref_name="bu_code" value="Store2"> 
     <Metric ref_name="Metric1"> 
      <Data value="1"/> 
      <Data value="2"/> 
     </Metric> 
     <Metric ref_name="Metric2"> 
      <Data value="1"/> 
     </Metric> 
     </Dimension> 
     <Dimension ref_name="bu_code" value="Store3"> 
     <Metric ref_name="Metric1"> 
      <Data value="1"/> 
      <Data value="2"/> 
     </Metric> 
     </Dimension> 
    </DataSet> 
</EnterpriseDocument> 
0

這裏是一個xslt-1.0解決方案。 這確實基於XSL分組:鍵(Muenchian Method

<?xml version="1.0" encoding="iso-8859-1"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:e="http://www.example.org" 
       xmlns:ns4="http://www.exampl.ns4.org"> 

    <xsl:strip-space elements="*" /> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:key name="kStore" match="e:Generic/e:store" use="."/> 
    <xsl:key name="kStoreMetric" match="e:Generic/e:metricName" use="concat(../e:store,'|', .)"/> 

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

    <xsl:template match="e:GenericCollection"> 
     <ns4:EnterpriseDocument> 
     <xsl:for-each select="//e:Generic/e:store[ 
      generate-id() = generate-id(key('kStore', .) [1]) 
       ]" > 
      <ns4:DataSet> 
       <ns4:Dimension ref_name="bu_code" value="{.}"> 
        <xsl:variable name="s" select="." /> 
        <xsl:for-each select="//e:metricName[ 
          generate-id() = generate-id(key('kStoreMetric', concat($s,'|', .)) [1]) 
          ]" > 
         <ns4:Metric ref_name="{.}"> 
          <xsl:variable name="m" select="."/> 
          <xsl:for-each select="key('kStoreMetric', concat($s,'|', $m))" > 
           <ns4:Data value="{../e:metricValue}"/> 
          </xsl:for-each> 
         </ns4:Metric> 
        </xsl:for-each> 
       </ns4:Dimension> 
      </ns4:DataSet> 
      </xsl:for-each> 
     </ns4:EnterpriseDocument> 
    </xsl:template> 

</xsl:stylesheet> 

這將產生以下輸出:

<ns4:EnterpriseDocument xmlns:ns4="http://www.exampl.ns4.org" xmlns:e="http://www.example.org"> 
    <ns4:DataSet> 
    <ns4:Dimension ref_name="bu_code" value="Store1"> 
     <ns4:Metric ref_name="Metric1"> 
     <ns4:Data value="1"/> 
     </ns4:Metric> 
     <ns4:Metric ref_name="Metric2"> 
     <ns4:Data value="1"/> 
     </ns4:Metric> 
    </ns4:Dimension> 
    </ns4:DataSet> 
    <ns4:DataSet> 
    <ns4:Dimension ref_name="bu_code" value="Store2"> 
     <ns4:Metric ref_name="Metric1"> 
     <ns4:Data value="1"/> 
     <ns4:Data value="2"/> 
     </ns4:Metric> 
     <ns4:Metric ref_name="Metric2"> 
     <ns4:Data value="1"/> 
     </ns4:Metric> 
    </ns4:Dimension> 
    </ns4:DataSet> 
    <ns4:DataSet> 
    <ns4:Dimension ref_name="bu_code" value="Store3"> 
     <ns4:Metric ref_name="Metric1"> 
     <ns4:Data value="1"/> 
     <ns4:Data value="2"/> 
     </ns4:Metric> 
    </ns4:Dimension> 
    </ns4:DataSet> 
</ns4:EnterpriseDocument>