-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 2.0,那么您可能应该在此处使用xsl:for-each-group,而不是xsl:for-each,因为您试图在此处对元素进行分组。

首先,您将按存储值按通用元素进行分组,因此您将编写此代码。

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

然后在此范围内,您将为组输出 * Dimension *元素,如下所示:

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

接下来,您希望通过metricName值进一步对该组中的元素进行分组

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

注意这里使用current-group()。您只迭代当前“商店”组中的元素,而不是所有通用元素。

最后,要输出所有数据元素,您可以这样做

<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>
于 2013-06-03T12:37:39.277 回答
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 回答