首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在xquery marklogic中更新节点/元素

如何在xquery marklogic中更新节点/元素
EN

Stack Overflow用户
提问于 2021-06-16 13:54:46
回答 1查看 48关注 0票数 1

如何在xquery中更新除node-replace之外的值?我有一个名为title的元素,它是空的,我应该将值更新为“submitted”。示例文件:

代码语言:javascript
运行
AI代码解释
复制
<books>
<title></title>
</books>
EN

回答 1

Stack Overflow用户

发布于 2021-06-16 14:55:18

我假设您是在请求xdmp:node-replace()的替代品,因为这个XML文档是内存中的对象,而不是(还没有)持久化文档?

您可以执行recursive descent typeswitch

代码语言:javascript
运行
AI代码解释
复制
xquery version "1.0-ml";

(: This is the recursive typeswitch function :)
declare function local:transform($nodes as node()*) as node()*
{
for $n in $nodes return
typeswitch ($n)
  case text() return $n
  case attribute() return $n
  case comment() return $n 
  case processing-instruction() return $n
  case element (title) return <title>submitted</title>
  default return element {$n/name()} {local:transform($n/(@*|node()))}
};

let $books :=
   <books foo="x"><!--test--><?PITarget PIContent?>
    <title></title>
  </books>
return
  local:transform($books)

,但我发现这很乏味,如果你最终需要更复杂的转换场景,就不喜欢通用的转换。

对于XQuery中更复杂的内存中XML结构的转换,我会考虑使用Ryan Dew的XQuery XML Memory Operations库:

代码语言:javascript
运行
AI代码解释
复制
import module namespace mem = "http://maxdewpoint.blogspot.com/memory-operations" 
  at "/memory-operations.xqy";

let $books :=
   <books>
    <title></title>
  </books>
return 
  mem:copy(fn:root($books)) ! (
    mem:replace(., $books/title, element title {"submitted"}),
    mem:execute(.)
  )

在转换XML时(无论是在内存中还是在数据库中的文档),我更喜欢XSLT。您可以使用xdmp:xslt-invoke() (带有已安装的样式表)或xdmp:xslt-eval()

代码语言:javascript
运行
AI代码解释
复制
xquery version "1.0-ml";
let $xslt :=
  <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>
    
    <xsl:template match="title">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:text>submitted</xsl:text>
        </xsl:copy>
    </xsl:template>
    
  </xsl:stylesheet>

let $books := 
  <books>
    <title></title>
  </books>

return xdmp:xslt-eval($xslt, $books)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68004115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文