比如我有这样选择节点没有特定子
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
我如何使用XPath的XML样本选择节点a
只包含
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
比如我有这样选择节点没有特定子
<a>
<a1>A1</a1>
<a11>A11</a11>
<a2>A2</a2>
Text <strong>text</strong> text...
<a>
我如何使用XPath的XML样本选择节点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:
//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>
为什么downvote? –
也许是因为XPath表达式根本没有选择节点? –
@DimitreNovatchev - 也许我误解了这个问题。我以为OP有两个不同的'',只想选择一个。在这种情况下,xpath会选择'a'节点。我添加了一个例子来说明我的误解。 –
XPath是一种查询语言XML文档。这意味着XPath表达式只能选择一组节点和/或提取数据。
切记:XPath表达式永远不会导致XML文档结构的模块化(例如删除节点)。
答案是由于XML文档中没有这样的节点,因此没有XPath表达式将选择您想要的节点。
你想可以很容易地使用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>
不完全是我想要的,但我已经能够修改它。也感谢网站 –