使用xslt过滤xml的元素

时间:2015-05-22 11:38:40

标签: xml xslt

我有以下xml文件:

<?xml version="1.0" encoding="UTF-8"? xmlns:xn="whatever.xsd>
    <rootNode>
        <fileHeader />
        <xn:child1>
            <xn:child2 id="1">
                ....
            </xn:child2>
            <xn:child2 id="2">
                ....
            </xn:child2>
            <xn:child2 id="3">
                ....
            </xn:child2>
                ....
        </xn:child1>
</rootNode>

我希望根据child2标记的id属性获取输出xml。为此,我有以下xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:xn="genericNrm.xsd">
    <!-- identity template -->
    <xsl:template match="@* | node()">
        <xsl:copy>
              <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <!-- override the above template for certain MeContext elements; output nothing. -->
    <xsl:template match="xn:child1[not(xn:child2/@id != '1') and not(xn:child2/@id != '3')]">
    </xsl:template>
</xsl:stylesheet>

所以,输出应该是这样的:

<?xml version="1.0" encoding="UTF-8"? xmlns:xn="whatever.xsd>
    <rootNode>
        <fileHeader />
        <xn:child1>
            <xn:child2 id="1">
                ....
            </xn:child2>
            <xn:child2 id="3">
                ....
            </xn:child2>
                ....
        </xn:child1>
</rootNode>

但是我无法得到它,我的xslt出了什么问题?

编辑:更新xslt,因为它有一个拼写错误

1 个答案:

答案 0 :(得分:2)

此:

<xsl:template match="xn:child[not(xn:child2/@id != '1') and not(xn:child2/@id != '3')]">

匹配名为xn:child的元素。您的XML中没有这样的元素。也许你的意思是:

<xsl:template match="xn:child2[@id != '1' and @id != '3']"/>

-
注意:命名空间声明不能出现在XML声明中。此外,如果您希望前缀匹配给定命名空间中的节点,则必须将其绑定到与XML输入使用的URI相同的命名空间URI(前缀本身可以是任何内容)。