XSL:使用starts-with条件排除元素

时间:2014-01-02 15:59:25

标签: xml xslt

我有这个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>

2 个答案:

答案 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>