如何在 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:id
、that 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 更短且更容易编写,但这是个人喜好。
我有一个文档,我写了一个忽略文档中的元素 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:id
、that 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 更短且更容易编写,但这是个人喜好。