XPath排除某些XML元素?

时间:2016-09-22 13:31:07

标签: xml xpath

我现在已经阅读了许多(可能是全部)关于在XPath中排除元素的帖子,我只是不能让它工作。我不知道为什么。

假设我有以下结构:

<root>
  <elemA>
      Hello World!
  </elemA>
  <elemB>
      This is awesome!
      <elemC>Really!</elemC>
  </elemB>
</root>

不,我想要除elemC之外的所有元素。

根据我所读到的内容,我尝试了以下XPath:

选项1:

//*[not(self::elemC)]

选项2:

//*[not(name()='elemC')]

选项3:

//*[name()!='elemC']

我不知道为什么这不起作用,但怀疑有些愚蠢的错误。如果我完全相反(即省略not!),XPath会正确选择elemC元素。

结果应该是这样的:

<root>
  <elemA>
      Hello World!
  </elemA>
  <elemB>
      This is awesome!
  </elemB>
</root>

1 个答案:

答案 0 :(得分:2)

XPath是供选择的。您要选择的内容在XML文档中不存在。

您需要其他工具(例如 XSLT )来生成基于输入XML文档的XML输出文档。 XSLT可以通过身份转换简单地生成您想要的输出,该转换补充了一个简单的模板,该模板禁止复制您不想要的元素(elemC):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="elemC"/>
</xsl:stylesheet>

单靠XPath无法帮助您。