如何使用XSLT根据其值删除多个节点?

时间:2014-05-20 04:27:39

标签: xml xslt xslt-1.0

如何从输出中删除key节点?

xml(有多个像这样的xmls)

    <XMLResponse>
<ServiceProduct>
    <ProductInfo><ProductCode>1001</ProductCode></ProductInfo>
    <ProductType>BLACK</ProductType>
    <AvailableProduct>
        <ProductName>PRODUCT NAME ONE</ProductName>
    </AvailableProduct>
    <AvailableProduct>
        <ProductName>PRODUCT NAME TWO</ProductName>
    </AvailableProduct>
</ServiceProduct>
<ServiceProduct>
    <ProductInfo><ProductCode>1001</ProductCode></ProductInfo>
    <ProductType>BLACK</ProductType>
    <AvailableProduct>
        <ProductName>PRODUCT NAME ONE</ProductName>
    </AvailableProduct>
    <AvailableProduct>
        <ProductName>PRODUCT NAME TWO</ProductName>
    </AvailableProduct>
</ServiceProduct>
<ServiceProduct>
    <ProductInfo><ProductCode>1001</ProductCode></ProductInfo>
    <ProductType>BLACK</ProductType>
    <AvailableProduct>
        <ProductName>PRODUCT NAME ONE</ProductName>
    </AvailableProduct>
    <AvailableProduct>
        <ProductName>PRODUCT NAME THREE</ProductName>
    </AvailableProduct>
</ServiceProduct>
<ServiceProduct>
    <ProductInfo><ProductCode>1002</ProductCode></ProductInfo>
    <ProductType>BLACK</ProductType>
    <AvailableProduct>
        <ProductName>PRODUCT NAME ONE</ProductName>
    </AvailableProduct>
    <AvailableProduct>
        <ProductName>PRODUCT NAME TWO</ProductName>
    </AvailableProduct>
</ServiceProduct>
</XMLResponse>

XSL

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl">
            <xsl:output method="xml" indent="yes"/>
            <xsl:key name="ServiceByGroup" match="ServiceProduct" use="concat(ProductInfo/ProductCode,'|',ProductType)"/>


            <xsl:template match="XMLResponse">
                <xsl:copy>
                    <xsl:variable name="msNodes">
                        <xsl:apply-templates select="document('01_rs_01.xml')/*/ServiceProduct[ProductInfo/ProductCode != '']">

                        </xsl:apply-templates>
                    </xsl:variable>


                    <ServiceList>
                        <xsl:apply-templates select="exsl:node-set($msNodes)/ServiceProduct [generate-id() =  generate-id(key('ServiceByGroup', concat(ProductInfo/ProductCode,'|',ProductType))[1])]"/>
                    </ServiceList>
                </xsl:copy>
            </xsl:template>

            <xsl:template match="node()|@*">
                <xsl:copy>
                    <xsl:apply-templates select="node()|@*"/>
                </xsl:copy>
            </xsl:template>

        </xsl:stylesheet>

我在xsl

中尝试如下
<xsl:template match="ProductType"/>

当我应用上面的模板时,它会从输出中删除<ProductType>,但<xsl:apply-templates无法正常工作

我需要像下面那样放

<XMLResponse>
    <ServiceProduct>
        <ProductInfo><ProductCode>1001</ProductCode></ProductInfo>
        <AvailableProduct>
            <ProductName>PRODUCT NAME ONE</ProductName>
        </AvailableProduct>
        <AvailableProduct>
            <ProductName>PRODUCT NAME TWO</ProductName>
        </AvailableProduct>
    </ServiceProduct>
    <ServiceProduct>
        <ProductInfo><ProductCode>1001</ProductCode></ProductInfo>
        <AvailableProduct>
            <ProductName>PRODUCT NAME ONE</ProductName>
        </AvailableProduct>
        <AvailableProduct>
            <ProductName>PRODUCT NAME THREE</ProductName>
        </AvailableProduct>
    </ServiceProduct>
    <ServiceProduct>
        <ProductInfo><ProductCode>1002</ProductCode></ProductInfo>
        <AvailableProduct>
            <ProductName>PRODUCT NAME ONE</ProductName>
        </AvailableProduct>
        <AvailableProduct>
            <ProductName>PRODUCT NAME TWO</ProductName>
        </AvailableProduct>
    </ServiceProduct>
    </XMLResponse>

0 个答案:

没有答案