如何在 XQuery 中将处理指令更改为字符串值
How to change processing instruction to string value in XQuery
样本XML
<root>
<a>
<text>VOL <?P _line?> <?range val?></text>
</a>
<a>
<text><?x lp;80q?>sample</text>
</a>
</root>
预期产出
<root>
<a>
<text>VOL <?P _line?>test</text>
</a>
<a>
<text><?x lp;80q?>sample</text>
</a>
</root>
我需要将 Processing-instruction(range) 更改为 'test'
你能帮忙吗?
最自然的方式是复制-修改-return 子句,但我认为 MarkLogic 不支持 XQuery 更新工具。
递归可能会起作用,如下所示:
declare function local:replace($element as element()) as element()
{
element { node-name($element) } {
for $child in $element/node()
return typeswitch($child)
case processing-instruction(range)
return text { "test" }
case element()
return local:replace($child)
default
return $child
}
};
let $doc :=
<root>
<a>
<text>VOL <?P _line?> <?range val?></text>
</a>
<a>
<text><?x lp;80q?>sample</text>
</a>
</root>
return local:replace($doc)
(这适用于 oXygen 中的 Saxon,但这应该是纯粹的标准 XQuery)
注意:如果输入是文档节点,请使用 document { local:replace($doc/*) }
。
使用 XSLT 通常可以更轻松地对文档进行细微更改。这是一个 XSLT 3.0 解决方案:
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="processing-instruction(range)">test</xsl:template>
</xsl:transform>
样本XML
<root>
<a>
<text>VOL <?P _line?> <?range val?></text>
</a>
<a>
<text><?x lp;80q?>sample</text>
</a>
</root>
预期产出
<root>
<a>
<text>VOL <?P _line?>test</text>
</a>
<a>
<text><?x lp;80q?>sample</text>
</a>
</root>
我需要将 Processing-instruction(range) 更改为 'test' 你能帮忙吗?
最自然的方式是复制-修改-return 子句,但我认为 MarkLogic 不支持 XQuery 更新工具。
递归可能会起作用,如下所示:
declare function local:replace($element as element()) as element()
{
element { node-name($element) } {
for $child in $element/node()
return typeswitch($child)
case processing-instruction(range)
return text { "test" }
case element()
return local:replace($child)
default
return $child
}
};
let $doc :=
<root>
<a>
<text>VOL <?P _line?> <?range val?></text>
</a>
<a>
<text><?x lp;80q?>sample</text>
</a>
</root>
return local:replace($doc)
(这适用于 oXygen 中的 Saxon,但这应该是纯粹的标准 XQuery)
注意:如果输入是文档节点,请使用 document { local:replace($doc/*) }
。
使用 XSLT 通常可以更轻松地对文档进行细微更改。这是一个 XSLT 3.0 解决方案:
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="processing-instruction(range)">test</xsl:template>
</xsl:transform>