-1

以下の入力 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
4

2 に答える 2

0

ここに xslt-1.0 ソリューションがあります。xsl:key に基づいてグループ化を行うもの ( 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>
于 2013-06-03T12:53:33.923 に答える