xslt匹配除特定节点之外的所有节点

时间:2013-03-20 13:57:43

标签: xml xslt

我想匹配我的xml中的所有节点,除了一个即docbody。像

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

我如何实现这一目标,我尝试了上述方法。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

答案 2 :(得分:0)

是的,你只需要这样做:

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