特定属性节点替换

时间:2012-12-06 12:41:12

标签: xquery marklogic

如何在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>

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

<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> 

2 个答案:

答案 0 :(得分: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的比较。

答案 1 :(得分:0)

根据您提供的示例,您似乎要用text()标题title @ id ='primary的第一个@id='primary', and remove the other元素替换elements 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"})