首页 > 解决方案 > XSLT 2.0 一组多级

问题描述

问题是我如何获得我想要的输出?

我成功地为每个组创建了一个组,<LogistiekeDeelEenheid> 但是该<DeeleenheidAantal>字段也必须填充一个值。对于<LogistiekeDeelEenheid>000094<DeeleenheidAantal>必须用 xsl 中的 10 填充<Value AttributeID = "att_NumberInCombiProduct"> 10 </Value>才能进行转换。并且<LogistiekeDeelEenheid>000072<DeeleenheidAantal>必须用 20 来填充<Value AttributeID = "att_NumberInCombiProduct"> 20 </Value><LogistiekeDeelEenheid>000032<DeeleenheidAantal>必须用 35 来填充<Value AttributeID = "att_NumberInCombiProduct"> 35 </Value>

要转换的 xml:

<Test>
    <Product ID="LV-10432200" UserTypeID="CombiLogistiekeVariant">
        <Name>1 - TEST1</Name>
        <ProductCrossReference ProductID="Product-10430948"
            Type="rpp_CombiLogistiekeVariant2Product">
            <KeyValue KeyID="key_ProductGTIN">2311111</KeyValue>
            <KeyValue KeyID="key_Productnummer">000094</KeyValue>
            <MetaData>
                <Value AttributeID="att_AantalInCombiProduct">10</Value>
            </MetaData>
        </ProductCrossReference>
        <ProductCrossReference ProductID="Product-10431710"
            Type="rpp_CombiLogistiekeVariant2Product">
            <KeyValue KeyID="key_ProductGTIN">5449000018885</KeyValue>
            <KeyValue KeyID="key_Productnummer">000072</KeyValue>
            <MetaData>
                <Value AttributeID="att_AantalInCombiProduct">20</Value>
            </MetaData>
        </ProductCrossReference>
        <ProductCrossReference ProductID="Product-10431738"
            Type="rpp_CombiLogistiekeVariant2Product">
            <KeyValue KeyID="key_ProductGTIN">54419780</KeyValue>
            <KeyValue KeyID="key_Productnummer">000032</KeyValue>
            <MetaData>
                <Value AttributeID="att_AantalInCombiProduct" Changed="true">35
                </Value>
            </MetaData>
        </ProductCrossReference>
        <Values>
            <Value AttributeID="att_Productnummer">000001</Value>
            <Value AttributeID="att_LVStatus" ID="2">Inactief</Value>
            <Value AttributeID="att_LVOmschrijving">TEST Config 1</Value>
            <Value AttributeID="att_LVNummer">1</Value>
        </Values>
        <Product ID="Pack-10432212" UserTypeID="Kleinverpakking">
            <Name>21 - Kleinverpakking</Name>
            <ProductCrossReference ProductID="LV-10432200"
                Type="rpp_Verpakking-Kleinverpakking2Kleiner">
                <MetaData>
                    <Value AttributeID="att_AantalInVerpakking">1</Value>
                </MetaData>
            </ProductCrossReference>
            <Values>
                <Value AttributeID="att_VerpakkingBreedte" UnitID="unece.unit.CMT">1</Value>
                <Value AttributeID="att_VerpakkingGewichtBruto" UnitID="181">1
                </Value>
                <Value AttributeID="att_LVNummer">1</Value>
                <Value AttributeID="att_VerpakkingHoogte" UnitID="unece.unit.CMT">1</Value>
                <Value AttributeID="att_Productnummer">000001</Value>
                <Value AttributeID="att_VerpakkingDiepte" UnitID="unece.unit.CMT">1</Value>
                <Value AttributeID="att_PrimaireGTIN" Derived="true">Primaire GTIN
                    Ontbreekt
                </Value>
            </Values>
        </Product>
    </Product>
</Test> 

并且必须转换为:

                    <LogistiekeDeelEenheid>
                        <DeeleenheidArtikelNummer>000094</DeeleenheidArtikelNummer>
                        <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
                        <DeeleenheidCode>1</DeeleenheidCode>
                        <DeeleenheidLinkType>4</DeeleenheidLinkType>
                        <DeeleenheidAantal>10</DeeleenheidAantal>
                    </LogistiekeDeelEenheid>
                    <LogistiekeDeelEenheid>
                        <DeeleenheidArtikelNummer>000072</DeeleenheidArtikelNummer>
                        <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
                        <DeeleenheidCode>1</DeeleenheidCode>
                        <DeeleenheidLinkType>4</DeeleenheidLinkType>
                        <DeeleenheidAantal>20</DeeleenheidAantal>
                    </LogistiekeDeelEenheid>
                    <LogistiekeDeelEenheid>
                        <DeeleenheidArtikelNummer>000032</DeeleenheidArtikelNummer>
                        <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
                        <DeeleenheidCode>1</DeeleenheidCode>
                        <DeeleenheidLinkType>4</DeeleenheidLinkType>
                        <DeeleenheidAantal>35</DeeleenheidAantal>
                    </LogistiekeDeelEenheid>
               

我的 xslt:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates select="Test/Product"/>
    </xsl:template>
        <xsl:template match="Test/Product">
            <xsl:for-each-group select="//ProductCrossReference[@Type='rpp_CombiLogistiekeVariant2Product']" group-by="//ProductCrossReference/KeyValue[@KeyID='key_Productnummer']">
            <xsl:variable select="current-grouping-key()" name="Productnummer"/>
       <test>
           <xsl:value-of select="../Name"/>
       </test>
        <LogistiekeDeelEenheid>
            <DeeleenheidArtikelNummer>
                <xsl:value-of select="$Productnummer"/>
            </DeeleenheidArtikelNummer>
            <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
            <DeeleenheidCode>1</DeeleenheidCode>
            <DeeleenheidLinkType>4</DeeleenheidLinkType>
            <DeeleenheidAantal>
                <xsl:value-of select="../ProductCrossReference/MetaData/Value[@AttributeID='att_AantalInCombiProduct']"/>
            </DeeleenheidAantal>
        </LogistiekeDeelEenheid>
    </xsl:for-each-group>
        </xsl:template>
</xsl:stylesheet>

但是,如果我使用此代码,我会得到不正确的结果。第一个应该是 10 第二个应该是 20 第三个应该是 35

<?xml encoding="UTF-8" version="1.0"?>
<test>1 - TEST1</test>
<LogistiekeDeelEenheid>
   <DeeleenheidArtikelNummer>000094</DeeleenheidArtikelNummer>
   <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
   <DeeleenheidCode>1</DeeleenheidCode>
   <DeeleenheidLinkType>4</DeeleenheidLinkType>
   <DeeleenheidAantal>10 20 35
                </DeeleenheidAantal>
</LogistiekeDeelEenheid>
<test>1 - TEST1</test>
<LogistiekeDeelEenheid>
   <DeeleenheidArtikelNummer>000072</DeeleenheidArtikelNummer>
   <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
   <DeeleenheidCode>1</DeeleenheidCode>
   <DeeleenheidLinkType>4</DeeleenheidLinkType>
   <DeeleenheidAantal>10 20 35
                </DeeleenheidAantal>
</LogistiekeDeelEenheid>
<test>1 - TEST1</test>
<LogistiekeDeelEenheid>
   <DeeleenheidArtikelNummer>000032</DeeleenheidArtikelNummer>
   <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
   <DeeleenheidCode>1</DeeleenheidCode>
   <DeeleenheidLinkType>4</DeeleenheidLinkType>
   <DeeleenheidAantal>10 20 35
                </DeeleenheidAantal>
</LogistiekeDeelEenheid>

标签: xslt

解决方案


我在评论中提出的建议,调整为您稍后发布的代码,将导致

    <xsl:template match="Test/Product">
        <xsl:for-each-group select="ProductCrossReference[@Type='rpp_CombiLogistiekeVariant2Product']" 
        group-by="KeyValue[@KeyID='key_Productnummer']">
        <xsl:variable select="current-grouping-key()" name="Productnummer"/>
   <test>
       <xsl:value-of select="../Name"/>
   </test>
    <LogistiekeDeelEenheid>
        <DeeleenheidArtikelNummer>
            <xsl:value-of select="$Productnummer"/>
        </DeeleenheidArtikelNummer>
        <DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
        <DeeleenheidCode>1</DeeleenheidCode>
        <DeeleenheidLinkType>4</DeeleenheidLinkType>
        <DeeleenheidAantal>
            <xsl:value-of select="MetaData/Value[@AttributeID='att_AantalInCombiProduct']"/>
        </DeeleenheidAantal>
    </LogistiekeDeelEenheid>
</xsl:for-each-group>
    </xsl:template>

https://xsltfiddle.liberty-development.net/ei5R4tY我将建议应用于您编辑的输入样本,结果具有例如<DeeleenheidAantal>10</DeeleenheidAantal>,即结果中该项目的单个值。

我必须承认您的嵌套样本数据对我来说仍然不清楚,但请随时进一步编辑您的问题并澄清您想要处理和分组的数据。


推荐阅读