使用XQUERY消除XML中的单个元素类型
问题描述:
这是我的问题...我需要选择整个xml文档中的所有内容,但是只留下一个标签。不幸的是,这个标签可能会有所不同。使用XQUERY消除XML中的单个元素类型
使用下面的代码示例,我想要删除所有<crud>
,<crud2>
和<...>
(等)元素。 <crud>
可能会有更多的孩子,但我不希望他们反正。
<body>
<h2/>
<crud>
<crud2/>
<...>
</crud>
<div>
<p> </p>
</div>
<div>
<p>
</p>
<crud>
<crud2/>
<...>
</crud>
</div>
</body>
我试过几种方法。
let $body := "the xml sample"
return $body/*[fn:not(descendant-or-self::crud)]
这种方法需要很多。它将删除包含crud的整个<div>
块,但我需要包含<div>
和<p>
。 所有其他方法似乎只删除<body>
的子代<crud>
,或者也将其移除。
所以,我基本上需要一种方法,达到每个元素,并删除所有的<crud>
而不采取任何其他措施。
最终的XML应该是这样的:
<body>
<h2/>
<div>
<p> </p>
</div>
<div>
<p>
</p>
</div>
</body>
我非常感谢任何及所有的帮助。
答
这种处理是最容易使用XSLT完成,这比XQuery的更有表现力:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="crud"/>
</xsl:stylesheet>
当这种变换所提供的XML文档应用:
<body>
<h2/>
<crud>
<crud2/>
</crud>
<div>
<p> </p>
</div>
<div>
<p> </p>
<crud>
<crud2/>
</crud>
</div>
</body>
想要的,正确的结果产生:
<body>
<h2/>
<div>
<p> </p>
</div>
<div>
<p> </p>
</div>
</body>
说明:
身份规则副本的每个节点“原样。
单个模板覆盖身份规则/模板。它匹配anu
crud
元素,其空主体结果为crud
(以及由其排序的任何子树)将被剥离输出。
答
这是使用XQuery Update及其copy-statement一件容易的事:
copy $c := .
modify delete node $c//crud
return $c
如果你可以改变你的原始文件,你甚至可以用更短的delete node //crud
。
谢谢你的帮助。我现在走在正确的轨道上,但我似乎还有一个问题。如果在整个文档中使用命名空间标记crud,会怎么样?所以''实际上是''。我已将xslt中的匹配更改为some:crud,但现在我得到了“前缀某些没有名称空间绑定”。 –
SpockJenkins
哦..明白了。在根标签中声明名称空间。 ''。再次感谢您的帮助。 –
SpockJenkins