Xml 如何在XQuery中将处理指令更改为字符串值
示例XMLXml 如何在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>
<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轮子的翻版。