2016-12-15 93 views
0

我有以下XML。使用XSLT从XML跨多个节点对多个属性进行分组

如何在xslt 1.0中将我的元素按组名称分组?我需要根据communs_params地址,价格和增值将这些值分组。其他PARAMS(类型)必须在different_params

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<productsGrouppe> 
<product> 
    <adressParam> 
    <parameter name="adress" > 
    <value>street 1 </value> 
    </parameter> 
    </adressParam> 
    <priceParam> 
    <parameter name="price" > 
    <value>100 EUR </value> 
    </parameter> 
    <parameter name="vat" > 
    <value> 1 </value> 
    </parameter> 
    </priceParam> 
    <deliveryParam> 
    <parameter name="type" > 
    <value> post </value> 
    </parameter> 
    </deliveryParam> 
</product> 
<product> 
    <adressParam> 
    <parameter name="adress" > 
    <value>street 2 </value> 
    </parameter> 
    </adressParam> 
    <priceParam> 
    <parameter name="price" > 
    <value>200 EUR </value> 
    </parameter> 
    <parameter name="vat" > 
    <value> 2 </value> 
    </parameter> 
    </priceParam> 
    <deliveryParam> 
    <parameter name="type" > 
    <value> E-mail </value> 
    </parameter> 
    </deliveryParam> 
</product> 
<product> 
    <adressParam> 
    <parameter name="adress" > 
    <value>street 1 </value> 
    </parameter> 
    </adressParam> 
    <priceParam> 
    <parameter name="price" > 
    <value>100 EUR </value> 
    </parameter> 
    <parameter name="vat" > 
    <value> 1 </value> 
    </parameter> 
    </priceParam> 
    <deliveryParam> 
    <parameter name="type" > 
    <value> selfcollectors </value> 
    </parameter> 
    </deliveryParam> 
</product> 
</productsGrouppe> 

预期结果进行分组:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<productsGrouppe> 
<product> 
    <commun_params> 
    <value>street 1 </value> 
    <value>100 EUR </value> 
    <value> 1 </value> 
    </commun_params> 
    <different_params> 
    <value> post </value> 
     <value> selfcollectors </value> 
    </different_params> 
</product> 
</productsGrouppe> 
+0

我建议你从这里开始:http://www.jenitennison.com/xslt/grouping/muenchian.html如果你运行,然后回来成为实现这个的实际问题。 –

+0

这是我的尝试: – Jeeyong

回答

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

    <xsl:key name="product_adress" match="adressParam/parameter[@name='adress']/value" use="."/> 

    <xsl:variable name="priceparam_price" select="priceParam/parameter[@name='price']/value"></xsl:variable> 
    <xsl:variable name="priceparam_vat" select="priceParam/parameter[@name='vat']/value"></xsl:variable> 
    <xsl:variable name="adressParam_adress" select="adressParam/parameter[@name='adress']/value"></xsl:variable> 

    <xsl:template match="productsGrouppe"> 
     <product> 
      <xsl:apply-templates select="product/adressParam/parameter[@name='adress']/value[generate-id(.)=generate-id(key('product_adress',.)[1])]"/> 
     </product> 
    </xsl:template> 

    <xsl:template match="product"> 

      <xsl:for-each select="key('product_adress', $adressParam_adress)"> 
       <commun_params> 
        <value><xsl:value-of select="$adressParam_adress" /></value> 
        <value><xsl:value-of select="$priceparam_price" /></value> 
        <value><xsl:value-of select="$priceparam_vat" /></value> 
       </commun_params> 
      </xsl:for-each> 

    </xsl:template> 

</xsl:stylesheet> 

而那是结果:

街道1个街道2