Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在XQuery中将处理指令更改为字符串值_Xml_Xquery_Marklogic - Fatal编程技术网

Xml 如何在XQuery中将处理指令更改为字符串值

Xml 如何在XQuery中将处理指令更改为字符串值,xml,xquery,marklogic,Xml,Xquery,Marklogic,示例XML <root> <a> <text>VOL <?P _line?> <?range val?></text> </a> <a> <text><?x lp;80q?>sample</text> </a> </root> 卷 样品 预期产量 <root> <a>

示例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更新功能

递归可能会起作用,大致如下:

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)
declare function local:replace($element as element())as element()
{
元素{节点名($element)}{
对于$element/node()中的$child
返回类型开关($child)
案例处理指令(范围)
返回文本{“test”}
case元素()
返回本地:替换($child)
违约
返回$child
}
};
让$doc:=
卷
样品
返回本地:替换($doc)
(这适用于氧气中的Saxon,但这应该是纯粹的标准XQuery)


注意:如果输入是文档节点,请使用
document{local:replace($doc/*)}

最自然的方法是使用copy-modify-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)
declare function local:replace($element as element())as element()
{
元素{节点名($element)}{
对于$element/node()中的$child
返回类型开关($child)
案例处理指令(范围)
返回文本{“test”}
case元素()
返回本地:替换($child)
违约
返回$child
}
};
让$doc:=
卷
样品
返回本地:替换($doc)
(这适用于氧气中的Saxon,但这应该是纯粹的标准XQuery)


注意:如果输入是文档节点,则使用
文档{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>

测试

使用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>

测试

感谢它工作正常,我需要传递函数返回文本{$type}中的参数,而不是硬编码的“test”,很高兴我能提供帮助!感谢它工作良好,我需要传递函数返回文本{$type}中的参数,而不是硬编码的“test”,很高兴我能提供帮助!是的,我赞成。一般来说,XSLT更擅长转换,XQuery更擅长查询。在某种程度上,XQuery代码中的函数可以看作是对XSLT轮子的重新发明。一般来说,XSLT更擅长转换,XQuery更擅长查询。在某种程度上,XQuery代码中的函数可以看作是XSLT轮子的翻版。