例如,我有一个这样的 XML 示例
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
如何使用 XPath 选择a
仅包含的节点
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
不确定这对您来说是否足够灵活,但它应该可以帮助您入门
/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))]
您可以在这里轻松地使用它:http ://www.xpathtester.com/test
XPath 是一种用于 XML 文档的查询语言。这意味着 XPath 表达式只能选择一组节点和/或提取数据。
请记住:XPath 表达式永远不会导致 XML 文档结构的修改(例如删除节点)。
答案是没有 XPath 表达式会选择您想要的节点,因为 XML 文档中没有这样的节点。
使用 XSLT 和(不那么容易)使用 XQuery 可以轻松实现您想要的:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(), 'a1')]"/>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2> Text
<strong>text</strong> text...
</a>
产生了想要的正确结果:
<a>
<a2>A2</a2> Text
<strong>text</strong> text...
</a>
这个xpath:
//a[normalize-space(.)='A2 Text text text...']
只会选择:
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
XSLT 示例...
XML 输入
<doc>
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
</doc>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select="//a[normalize-space(.)='A2 Text text text...']"/>
</xsl:template>
</xsl:stylesheet>
XML 输出
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>