我有这个XML文件:
<ID>
<T1>
<T2>XXXXX</T2>
<T2>XXXXX</T2>
</T1>
<T3>
<T4>
<TxId>AAAXXXXXXXXXXX</TxId>
</T4>
<T4>
<TxId>BBBXXXXXXXXXXX</TxId>
</T4>
<T4>
<TxId>BBXXXXXXXXXXX</TxId>
</T4> ....
当TxId = AAA
的3个第一个字符时,我需要排除T4元素我试过了:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--Identity template,
provides default behavior that copies all content into the output -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--More specific template for Node766 that provides custom behavior -->
<xsl:template match="T4">
<xsl:copy>
<xsl:apply-templates select="TxId[not(starts-with(.,'AAA'))]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:4)
而不是
<xsl:template match="T4">
<xsl:copy>
<xsl:apply-templates select="TxId[not(starts-with(.,'AAA'))]"/>
</xsl:copy>
</xsl:template>
你需要像
这样的东西<xsl:template match="T4[TxId[starts-with(.,'AAA')]]" priority="2">
</xsl:template>
换句话说,对于任何T4元素,您希望样式表使用标识模板并递归复制T4,除非它与第二个模板匹配。在后一种情况下,不输出任何内容(模板为空)。
第二个模板的默认优先级高于身份模板,因为它的匹配模式;但我喜欢明确优先级,所以我们可以很容易地看到第二个模板在匹配时打算覆盖。
答案 1 :(得分:3)
当TxId = AAA
的3个第一个字符时,我需要排除T4元素
如果要排除某些<T4>
元素,则应在匹配“T4”时应用谓词 - 而不是在选择子项时。
例如:
<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="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="T4[not(starts-with(TxId,'AAA'))]">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="T4"/>
</xsl:stylesheet>