gpt4 book ai didi

xquery - 如何高效替换XML的多个节点?

转载 作者:行者123 更新时间:2023-12-02 06:23:12 26 4
gpt4 key购买 nike

我试图一次性替换单个文档的大约 500 个节点,并且我的数据库中有 5000 多个文档。

我正在使用的代码与我之前问过的这个问题有关- Link

有什么建议可以提高我的代码效率吗?

最佳答案

通常应避免使用 in-mem-update 库,特别是在对同一文档进行多次方法调用时。由于每个方法都会遍历整个节点树并生成一个全新的文档,因此如果您针对大型文档运行和/或对这些文档进行一堆 mem:* 方法调用,则可能会很慢且成本高昂。

更好的替代品是 Ryan Dew 的 XQuery XML Memory Operations library ,或使用 XSLT。

下面是如何使用 XSLT 执行这种“合并”的示例,它的性能应该比 in-mem-update 方法更好:

declare variable $STAGING := document{
<root>
<ID>1</ID>
<value1>India</value1>
<value2>USA</value2>
<value3>Russia</value3>
<value4>Srilanka</value4>
<value5>Europe</value5>
<value6>Antartica</value6>
<value7>Spain</value7>
</root>
};

declare variable $FINAL := document{
<root>
<ID>1</ID>
<value1></value1>
<value2></value2>
<value3></value3>
<value4></value4>
<value5>Europe</value5>
<value6>Antartica</value6>
</root>
};

declare variable $XSLT :=
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:param name="staging-doc"/>
<xsl:param name="element-names"/>

<xsl:variable name="final-doc" select="/"/>

<xsl:key name="staging-elements" match="root/*[local-name() = $element-names]" use="local-name()"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="root/*[local-name() = $element-names]">
<!--if there is an element in the staging-elements doc with this name, use it. Otherwise, use the matched element from this doc -->
<xsl:copy-of select="(key('staging-elements', local-name(.), $staging-doc), .)[1]"/>
</xsl:template>

<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<!-- also copy any other elements with the specified names from the staging document that were not already in the final -->
<xsl:apply-templates select="$staging-doc/root/*[local-name() = $element-names and not(key('staging-elements', local-name(), $final-doc))]"/>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>;

declare variable $PARAMS := map:new((
map:entry("staging-doc", $STAGING),
map:entry("element-names", tokenize(("value1,value2,value3,value4,value7"), ",") )
));

xdmp:xslt-eval($XSLT, $FINAL, $PARAMS)

关于xquery - 如何高效替换XML的多个节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52201151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com