XSLT匹配除了一个特定的所有节点(xslt match all nodes except a sp

2019-08-17 18:59发布

我想,以配合我的XML的所有节点,除了一个即docbody。 就像是

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

我如何做到这一点,我想上面的方式。

Answer 1:

匹配所有,但这个(添加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>


Answer 2:

你的匹配条件说“不具有任何节点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>


Answer 3:

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

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


文章来源: xslt match all nodes except a specific one
标签: xml xslt