XSL:选择节点中的所有文本,但某种类型的节点除外

时间:2009-05-20 18:48:11

标签: xslt

如何输出节点中的所有文本,包括其子节点中的文本,同时排除“a”节点中的文本?

4 个答案:

答案 0 :(得分:8)

使用文本节点的内置模板规则,即将它们复制到结果中。即使对于您指定的新处理模式(下面的代码中的“all-but-a”),内置规则也适用:对于元素,(递归地)处理子代;对于文本节点,复制。您只需覆盖其中一个<a>元素的规则,因此就是空模板规则,它可以有效地删除文本。

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="myNode">
    <!-- Process children -->
    <xsl:apply-templates mode="all-but-a"/>
  </xsl:template>

          <!-- Don't process <a> elements -->
          <xsl:template mode="all-but-a" match="a"/>

</xsl:stylesheet>

有关内置模板规则如何工作的完整说明,请查看我网站上"How XSLT Works"的“内置模板规则”部分。

答案 1 :(得分:3)

如果您当前正在处理您的节点。

<xsl:value-of select="."/>

应该返回所有文字内容

答案 2 :(得分:1)

<xsl:for-each select="//*[text() and name() != 'a']">
<xsl:value-of select="."/>
</xsl:for-each>

答案 3 :(得分:1)

我相信这就是你要找的东西:

<xsl:for-each select="//text()[not(ancestor::a)]">
  <xsl:value-of select="."/>
</xsl:for-each>

它选择不是锚标记子项的所有文本节点。