2013-03-20 105 views
1

我想匹配我的xml中除了一个ie docbody之外的所有节点。像xslt匹配除特定节点以外的所有节点

<xsl:template match="@*|node()[not(docBody)]" name="identity"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()"> 
</xsl:copy> 
</xsl:template> 

我如何实现这一点,我试过上面的方式。

+0

问题是什么? – kamituel 2013-03-20 13:58:52

+0

我试图以这种方式排除节点,它不工作,是否有一种排除匹配 – luckyluke 2013-03-20 14:05:40

回答

3

匹配所有,但这个(添加self::),并覆盖默认模板docBody(没有它的docBody内容将仍然被打印):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 

<xsl:template match="@*|node()[not(self::docBody)]" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<!-- overwrite the default template --> 
<xsl:template match="docBody"> 
</xsl:template> 

</xsl:stylesheet> 
+0

要排除注释,XPath是否会成为@ @ |节点()[not(self :: comment())]'或'@ * | node()[not(// comment())]'分别表示? – CoDEmanX 2014-01-06 18:13:11

0

是的,你只需要做到这一点:

<xsl:template match="@*|node()[not(self::docBody)]" name="identity"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"> 
    </xsl:copy> 
</xsl:template> 
4

你的匹配条件说“不具有docBody元素任何节点”,这是不是一个docBody元素本身不同。你想这样的:

<xsl:template match="@*|node()[not(self::docBody)]" name="identity"> 

虽然你应该只使用两个模板:

<xsl:template match="docBody"/> 

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

+1节点的方法“尽管您应该只使用两个模板” – 2013-03-20 14:14:01

相关问题