XSLT:根据其值复制节点

时间:2015-10-19 14:12:43

标签: xml xslt

给出以下XML示例文件:

<A>
    <B>
        <elem1 att1="SN:" att2="toto" att3="tata"/>
    </B>
    <B>
        <elem1 att1="tata" att2="SN:" att3="toto"/>
    </B>
    <B>
        <elem1 att1="toto" att2="tata" att3="SN:"/>
    </B>
</A>

我想执行XSL转换以删除值等于&#34; SN:&#34;的属性,从而产生期望的输出:

<A>
    <B>
        <elem1 att2="toto" att3="tata"/>
    </B>
    <B>
        <elem1 att1="tata" att3="toto"/>
    </B>
    <B>
        <elem1 att1="toto" att2="tata"/>
    </B>
</A>

当相同元素具有匹配属性时,我可以使用条件隔离元素,但是当我不知道哪个属性等于&#34; SN:&#34;时,我如何隔离元素? ?

也许更准确:我知道如何隔离像这样的元素如果att1值=&#34; SN:&#34;,然后删除它,但我怎么能只做如果attX值=&#34; SN:&#34;,然后将其删除

我想删除它们以便我可以连接&#34; SN:&#34;与另一个元素的另一个值。

1 个答案:

答案 0 :(得分:1)

只需使用 identity transform 模板将所有复制,并通过将其与空模板匹配来禁止值为“SN:”的任何属性。

XSLT 1.0

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

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

<xsl:template match="@*[.='SN:']"/>

</xsl:stylesheet>