合并不同的产品属于每个标准



我必须转换以下xml内容,

<Standards xmlns="http://ws.wso2.org/dataservice">
    <Standard>
        <ProductID>200057</ProductID>
        <Prefix>ISO</Prefix>
        <SNumber>1001</SNumber>
        <DraftProducts>
            <RelatedProduct>
                <ProductID>1500163</ProductID>
            </RelatedProduct>
        </DraftProducts>
        <ReferenceProducts>
            <RelatedProduct>
                <ProductID>263973</ProductID>
                <RelationId>708519</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>320056</ProductID>
                <RelationId>934789</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
        </ReferenceProducts>
        <RelatedIntProducts>
            <RelatedProduct>
                <ProductID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                <RelationId>116881</RelationId>
                <Relationship>Identical</Relationship>
                <Designation>NEN ISO 1001</Designation>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>208076</ProductID>
                <RelationId>116886</RelationId>
                <Relationship>Identical</Relationship>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
        </RelatedIntProducts>
        <S1>1001</S1>
        <S2>1986</S2>
    </Standard>
    <Standard>
        <ProductID>200058</ProductID>
        <Prefix>ISO</Prefix>
        <SNumber>1002</SNumber>
        <DraftProducts>
            <RelatedProduct>
                <ProductID>1500167</ProductID>
            </RelatedProduct>
        </DraftProducts>
        <ReferenceProducts>
            <RelatedProduct>
                <ProductID>263974</ProductID>
                <RelationId>708519</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>320052</ProductID>
                <RelationId>934754</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
        </ReferenceProducts>
        <RelatedIntProducts>
            <RelatedProduct>
                <ProductID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                <RelationId>116837</RelationId>
                <Relationship>Identical</Relationship>
                <Designation>NEN ISO 1001</Designation>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>208074</ProductID>
                <RelationId>116843</RelationId>
                <Relationship>Identical</Relationship>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
        </RelatedIntProducts>
        <S1>1005</S1>
        <S2>1983</S2>
    </Standard>
</Standards>

在此输出格式中,

<Standards xmlns="http://ws.wso2.org/dataservice">
    <Standard>
        <ProductID>200057</ProductID>
        <Prefix>ISO</Prefix>
        <SNumber>1001</SNumber>
        <RelatedProducts>
            <RelatedProduct>
                <ProductID>1500163</ProductID>
                <RelationType>DraftProducts</RelationType>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>263973</ProductID>
                <RelationId>708519</RelationId>
                <RelationType>ReferenceProducts</RelationType>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>320056</ProductID>
                <RelationId>934789</RelationId>
                <RelationType>ReferenceProducts</RelationType>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                <RelationId>116881</RelationId>
                <Relationship>Identical</Relationship>
                <RelationType>RelatedIntProducts</RelationType>
                <Designation>NEN ISO 1001</Designation>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>208076</ProductID>
                <RelationId>116886</RelationId>
                <RelationType>RelatedIntProducts</RelationType>
                <Relationship>Identical</Relationship>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
        </RelatedProducts>
        <S1>1001</S1>
        <S2>1986</S2>
    </Standard>
    <Standard>
        <ProductID>200058</ProductID>
        <Prefix>ISO</Prefix>
        <SNumber>1002</SNumber>
        <RelatedProducts>
            <RelatedProduct>
                <ProductID>1500167</ProductID>
                <RelationType>DraftProducts</RelationType>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>263974</ProductID>
                <RelationId>708519</RelationId>
                <RelationType>ReferenceProducts</RelationType>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>320052</ProductID>
                <RelationId>934754</RelationId>
                <RelationType>ReferenceProducts</RelationType>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                <RelationId>116837</RelationId>
                <RelationType>RelatedIntProducts</RelationType>
                <Relationship>Identical</Relationship>
                <Designation>NEN ISO 1001</Designation>
            </RelatedProduct>
            <RelatedProduct>
                <ProductID>208074</ProductID>
                <RelationId>116843</RelationId>
                <RelationType>RelatedIntProducts</RelationType>
                <Relationship>Identical</Relationship>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            </RelatedProduct>
        </RelatedProducts>
        <S1>1005</S1>
        <S2>1983</S2>
    </Standard>
</Standards>

我使用了以下 xslt,但仍然没有按预期给出输出。给定的 xslt 仅在有一个标准时才有效。但是对于多个标准,由于我在这里使用的 xsl 模板,它会给出重复的结果。

<?xml version="1.0" encoding="UTF-8"?>

<!-- When matching RelatedIntProducts: do nothing -->
<xsl:template match="//x:Standards/x:Standard/x:DraftProducts" />
<xsl:template match="//x:Standards/x:Standard/x:RelatedIntProducts" />
<xsl:template match="//x:Standards/x:Standard/x:SupersdProducts" />
<xsl:template match="//x:Standards/x:Standard/x:LinkProducts" />

    <xsl:template match="//x:Standards/x:Standard/x:ReferenceProducts">
        <RelatedProducts>
            <xsl:for-each select="//x:Standards/x:Standard/*/x:RelatedProduct">
                <RelatedProduct>
                    <ProductID>
                        <xsl:value-of select="x:ProductID">
                        </xsl:value-of>
                    </ProductID>
                    <RelationId>
                        <xsl:value-of select="x:RelationId">
                        </xsl:value-of>
                    </RelationId>
                    <RelationType>
                        <xsl:value-of select="name(..)" />
                    </RelationType>
                </RelatedProduct>
            </xsl:for-each>
        </RelatedProducts>
    </xsl:template>
</xsl:stylesheet>

对于每个标准,我需要将所有不同类型的相关产品合并到一个名为相关产品的列表中。我还需要保持其他东西不变。你能帮我实现这一目标吗?

从命令式"拉取"处理 (<xsl:for-each...>) 切换到"推送"处理(依赖于 XSL 引擎的自然处理循环)大大简化了样式表。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:x="http://ws.wso2.org/dataservice"
    xmlns="http://ws.wso2.org/dataservice"
    exclude-result-prefixes="x"
    version="1.0">
    <xsl:output indent="yes" method="xml" />
    <!-- Identity Transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="x:Standard">
        <xsl:copy>
            <xsl:copy-of select="x:ProductID"/>
            <xsl:copy-of select="x:Prefix"/>
            <xsl:copy-of select="x:SNumber"/>
            <RelatedProducts>
                <xsl:apply-templates select=".//x:RelatedProduct"/>
            </RelatedProducts>
            <xsl:copy-of select="x:S1"/>
            <xsl:copy-of select="x:S2"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="x:RelatedProduct">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <RelationType><xsl:value-of select="name(..)"/></RelationType>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

这本质上是一个"身份转换"加上一个模板来匹配Standard,并且只从其中输出我们想要的内容。 x:RelatedProduct模板将这些元素逐字复制到输出,并添加其文本为包含元素名称的RelationType元素。

输出为

<?xml version="1.0" encoding="UTF-8"?>
<Standards xmlns="http://ws.wso2.org/dataservice">
    <Standard>
      <ProductID>200057</ProductID>
      <Prefix>ISO</Prefix>
      <SNumber>1001</SNumber>
      <RelatedProducts>
         <RelatedProduct>
                <ProductID>1500163</ProductID>
            <RelationType>DraftProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID>263973</ProductID>
                <RelationId>708519</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            <RelationType>ReferenceProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID>320056</ProductID>
                <RelationId>934789</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            <RelationType>ReferenceProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                <RelationId>116881</RelationId>
                <Relationship>Identical</Relationship>
                <Designation>NEN ISO 1001</Designation>
            <RelationType>RelatedIntProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID>208076</ProductID>
                <RelationId>116886</RelationId>
                <Relationship>Identical</Relationship>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            <RelationType>RelatedIntProducts</RelationType>
         </RelatedProduct>
      </RelatedProducts>
      <S1>1001</S1>
      <S2>1986</S2>
   </Standard>
    <Standard>
      <ProductID>200058</ProductID>
      <Prefix>ISO</Prefix>
      <SNumber>1002</SNumber>
      <RelatedProducts>
         <RelatedProduct>
                <ProductID>1500167</ProductID>
            <RelationType>DraftProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID>263974</ProductID>
                <RelationId>708519</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            <RelationType>ReferenceProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID>320052</ProductID>
                <RelationId>934754</RelationId>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            <RelationType>ReferenceProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
                <RelationId>116837</RelationId>
                <Relationship>Identical</Relationship>
                <Designation>NEN ISO 1001</Designation>
            <RelationType>RelatedIntProducts</RelationType>
         </RelatedProduct>
         <RelatedProduct>
                <ProductID>208074</ProductID>
                <RelationId>116843</RelationId>
                <Relationship>Identical</Relationship>
                <Designation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
            <RelationType>RelatedIntProducts</RelationType>
         </RelatedProduct>
      </RelatedProducts>
      <S1>1005</S1>
      <S2>1983</S2>
   </Standard>
</Standards>

相关内容

  • 没有找到相关文章

最新更新