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

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

我有一个文档,我写了一个忽略文档中的元素 id 和 return 文档如下但抛出错误

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

returns

Error: undefined variable $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

这将 return 文档中的一系列子元素(但文档只有一个直接子元素,因此除非恰好是 sar:idthat likely won't achieve what you are trying to do .

如果您想要 return 包含除 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"))

否则,您可以 运行 通过带有类型切换的递归下降函数。我发现 XSLT 更短且更容易编写,但这是个人喜好。