如何在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>
答案 0 :(得分:1)
如果您刚开始使用XQuery和MarkLogic,http://developer.marklogic.com/learn/technical-overview和http://developer.marklogic.com/learn可能会有所帮助。
修改元素和属性的最佳方法取决于您未提供的上下文。我想第一个问题是“如何按属性选择节点?”一点点XPath就是这样做的。对于数据库中的所有章节:
/chapters/title[@id eq $id]
...或相对于先前选择的元素序列(章节)*
$chapters/title[@id eq $id]
如果这是一个数据库文档,您可以使用http://docs.marklogic.com/xdmp:node-replace和http://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"})