繁体   English   中英

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

我需要将处理指令(范围)更改为“测试” ,您能帮忙吗?

最自然的方式是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM