我必须转换以下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>
对于每个标准,我需要将所有不同类型的RelatedProducts合并到一个名为RelatedProducts的列表中。另外,我需要保留其他内容。能否帮助我实现这一目标。
答案 0 :(得分:2)
从命令式“拉”处理(<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>