0

如何在 MarkLogic 中为特定属性进行节点替换?例如如下:

<chapters>
<title id="primary">first primary content</title>
<title id="primary">second primary content</title>
<title id="secondary">this is amy middle content</title>
<title id="terciary">this is amy last content</title>
</chapters>

我想要像下面这样:

<chapters>
<title id="primary">third primary content</title>
<title id="secondary">this is amy middle content</title>
<title id="terciary">this is amy last content</title>
</chapters>

我的意思是假设A.xml存储在 MarkLogic 数据库服务器中的文件包含如下数据:

<chaptermetadata>
<chapters>
<title id="primary">first content</title>
<title id="primary">second content</title>
<title id="secondary">This is middle content</title>
<title id="terciary">This is last content</title>
</chapters>
<chapters>
<title id="primary">fouth content</title>
<title id="primary">fifth content</title>
<title id="primary">sixth content</title>
<title id="secondary">This is new content</title>
<title id="terciary">This is old content</title>
</chapters>
<chaptermetadata>

现在,我想替换所有章节title中包含属性的所有元素中的节点,如下所示:@id='primary'

<chaptermetadata>
<chapters>
<title id="primary">common content</title>
<title id="secondary">This is middle content</title>
<title id="terciary">This is last content</title>
</chapters>
<chapters>
<title id="primary">common content</title>
<title id="secondary">This is new content</title>
<title id="terciary">This is old content</title>
</chapters>
<chaptermetadata> 
4

2 回答 2

1

如果您刚刚开始使用 XQuery 和 MarkLogic,http://developer.marklogic.com/learn/technical-overviewhttp://developer.marklogic.com/learn可能会有所帮助。

修改元素和属性的最佳方式取决于您未提供的上下文。我想第一个问题是“如何按属性选择节点?” 一个简单的 XPath 就可以做到这一点。对于数据库中的所有章节:

/chapters/title[@id eq $id]

...或相对于先前选择的元素序列(章节)*

$chapters/title[@id eq $id]

如果这是一个数据库文档,您可以使用http://docs.marklogic.com/xdmp:node-replacehttp://docs.marklogic.com/xdmp:node-delete函数从那里获取它。如果节点仅在内存中,请参阅http://docs.marklogic.com/guide/app-dev/typeswitch以获取有关使用 XQuery typeswitch 或 XSLT 的指导和示例。在http://developer.marklogic.com/blog/tired-of-typeswitch有更多关于 typeswitch 和 XSLT 的示例和比较。

于 2012-12-06T16:26:31.057 回答
0

根据您提供的示例,您似乎想要替换标题为@id='primary'`text()的第一个title元素。@id='primary', and remove the otherelements with

下面将实现这一点,使用xdmp:node-replace()xdmp:node-delete()方法。

for $primary-title in doc("A.xml")/chaptermetadata/chapters/title[@id='primary']
return 
  if ($primary-title/preceding-sibling::title[@id='primary']) 
  then xdmp:node-delete($primary-title)
  else xdmp:node-replace($primary-title/text(), text{"common content"})
于 2018-08-20T00:54:14.197 回答