繁体   English   中英

如何在 marklogic 中使用 xquery 返回除元素之外的现有文档

[英]How to return a existing document except an element using xquery in marklogic

我有一个我写的文档忽略文档中的元素 id 并返回文档如下但抛出错误

let $ex := fn:doc("/name/docs")/* except $ex//sar:id return $ex

回报

错误:未定义的变量 $ex

您正试图在let语句中引用let变量。 你不能那样做。

let可以为文档创建一个变量,然后在类似的语句中使用它:

let $doc := fn:doc("/name/docs")
let $ex := $doc/* except $doc//sar:id 
return $ex

或者您可以使用一个简单的映射运算符:

let $ex := fn:doc("/name/docs") ! (./* except .//sar:id) 
return $ex

这将从文档中返回一系列子元素(但文档只有一个直接子元素,因此除非它恰好是sar:id ,否则可能无法实现您正在尝试做的事情

如果你想返回一个包含除sar:id元素之外的所有内容的新文档,那么你可以通过 XSLT 运行它,这是一个修改后的身份转换,带有一个匹配要排除的元素的空模板:

declare variable $XSLT := 
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:sar="sar-namespace-needs-to-be-updated-here">
    <!--this generic template matches on, and copies all attributes and nodes by default-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <!--this empty template will ensure that the sar:id is dropped from the output-->
    <xsl:template match="sar:id"/>
</xsl:stylesheet>;

xdmp:xslt-eval($XSLT, fn:doc("/name/docs"))

否则,您可以使用类型切换通过递归下降 function 运行它。 我发现 XSLT 更短也更容易写,但这是个人喜好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM