Xslt 选择没有特定子节点的节点
例如,我有这样一个XML示例Xslt 选择没有特定子节点的节点,xslt,xpath,lxml,Xslt,Xpath,Lxml,例如,我有这样一个XML示例 <a> <a1>A1</a1> <a11>A11</a11> <a2>A2</a2> Text <strong>text</strong> text... <a> 此xpath: //a[normalize-space(.)='A2 Text text text...'] 只会选择: <a>
<a>
<a1>A1</a1>
<a11>A11</a11>
<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>
A2
TextTextText。。。
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>
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
A1
A11
A2
TextTextText。。。
A2
TextTextText。。。
XSLT1.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输出
<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>
<a>
<a2>A2</a2>
Text <strong>text</strong> text...
</a>
A2
TextTextText。。。
不确定这对您来说是否足够灵活,但应该可以让您开始
/a/a1 | a/text() | /a/*[not(starts-with(name(), 'a'))]
您可以在这里轻松地使用它: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>
A1
A11
A2文本
文本文本。。。
生成所需的正确结果:
<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>
A2文本
文本文本。。。
可能是因为XPath表达式根本不选择节点?@DimitreNovatchev-可能是我误解了这个问题。我以为OP有两个不同的
,只想选择一个。在这种情况下,xpath会选择a
节点。我添加了一个示例来说明我的误解。如果将此答案中的转换应用于问题中提供的XML文档,则结果是空字符串。@DimitreNovatchev-我在Xalan、Saxon 6.5.5、Saxon HE 9.3和Saxon EE 9.3中尝试过。所有这些都对我有用。是的,但是你没有对OP提供的XML文档应用转换。这不完全是我想要的,但我已经能够修改它了。也谢谢你的网站