例如,我有一个像这样的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>
答案 0 :(得分:1)
不确定这是否足够灵活,但它应该让你开始
/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))]
您可以在此处轻松使用它:http://www.xpathtester.com/test
答案 1 :(得分:1)
XPath是XML文档的查询语言。这意味着XPath表达式只能选择一组节点和/或提取数据。
记住:XPath表达式永远不会导致对XML文档结构的调制(例如删除节点)。
答案是没有XPath表达式会选择你想要的节点,因为XML文档中没有这样的节点。
使用XQuery可以很容易地完成你想要的东西,并且(不那么容易)使用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>
答案 2 :(得分:0)
这个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>