使用变量删除XSLT中的节点

时间:2016-08-25 08:19:36

标签: xml xslt nodes

我是XSLT的新手。

我试图根据XML中另一个节点的值从我的XML中删除一个节点。

让我们说我有这个XML:

    <root>
    <body>
        <order>
            <orderAttributes>
                <attributeID>1</attributeID>
                <attributeValue>AAA</attributeValue>               
            </orderAttributes>
            <orderAttributes>
                <attributeID>2</attributeID>
                <attributeValue>BBB</attributeValue>                               
            </orderAttributes>            
        </order>
        <order>
            <orderAttributes>
                <attributeID>3</attributeID>
                <attributeValue>CCC</attributeValue>               
            </orderAttributes>
            <orderAttributes>                
                <attributeID>4</attributeID>
                <attributeValue>DDD</attributeValue>               
            </orderAttributes>          
        </order>
        <order>
            <orderAttributes>               
                <attributeID>5</attributeID>
                <attributeValue>EEE</attributeValue>               
            </orderAttributes>
            <orderAttributes>                
                <attributeID>6</attributeID>
                <attributeValue>FFF</attributeValue>               
            </orderAttributes>           
        </order>
    </body>
</root>

我有以下XSLT(版本1.0):

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">

    <xsl:param name="Attribute2" select="'BBB'" />
    <xsl:param name="Attribute3" select="'TTT'" />

    <xsl:output method="xml" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="orderAttributes">
        <xsl:choose>
            <xsl:when test="attributeID[text()=3]">
                <attributeValueChangeX9>
                    <attributeID>3</attributeID>
                    <attributeValue><xsl:value-of select="$Attribute3"/></attributeValue>
                </attributeValueChangeX9>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template match="order//orderAttributes[attributeID='6']">
    </xsl:template>  

这会将attributeID 3的值更改为&#34; TTT&#34;并删除attributeID 6。

但是,如果我想在属性3的值上删除属性6,我会添加如下内容:

    <xsl:template match="order//orderAttributes[attributeID='6'][preceding::orderAttributes[attributeIDX9='3' and valueX9='TTT']]">

当然这不起作用,因为XSLT不是程序性的,只能在源树上工作。 尝试将参数用作条件也无法完成,因为我不能在匹配模式中使用变量。

有什么方法可以做这样的事吗? (为了示例的目的,我将attribute3的默认值设为&#39; TTT&#39;,但这是一个输入参数,可以由使用此XSLT的任何人更改)

1 个答案:

答案 0 :(得分:0)

AFAICT,您正在尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="Attribute2" select="'BBB'" />
<xsl:param name="Attribute3" select="'TTT'" />

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

<xsl:template match="orderAttributes[attributeID='3']">
    <attributeValueChangeX9>
        <attributeID>3</attributeID>
        <attributeValue>
            <xsl:value-of select="$Attribute3"/>
        </attributeValue>
    </attributeValueChangeX9>
</xsl:template>

<xsl:template match="orderAttributes[attributeID='6']"> 
    <xsl:if test="$Attribute3 != 'TTT'">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

请注意,Attribute2参数不会在任何地方使用。