[英]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>
我需要将处理指令(范围)更改为“测试” ,您能帮忙吗?
最自然的方式是copy-modify-return子句,但是我认为MarkLogic不支持XQuery Update Facility。
递归可能会按照以下方式工作:
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.