使用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> 

说明

  1. 身份规则副本的每个节点“原样。

  2. 单个模板覆盖身份规则/模板。它匹配anu crud元素,其空主体结果为crud(以及由其排序的任何子树)将被剥离输出。

+0

谢谢你的帮助。我现在走在正确的轨道上,但我似乎还有一个问题。如果在整个文档中使用命名空间标记crud,会怎么样?所以''实际上是''。我已将xslt中的匹配更改为some:crud,但现在我得到了“前缀某些没有名称空间绑定”。 – SpockJenkins

+0

哦..明白了。在根标签中声明名称空间。 ''。再次感谢您的帮助。 – SpockJenkins

这是使用XQuery Update及其copy-statement一件容易的事:

copy $c := . 
modify delete node $c//crud 
return $c 

如果你可以改变你的原始文件,你甚至可以用更短的delete node //crud