是否有一种简单的方法(可能使用 Linux 中的开源命令行工具)从给定的 XML 文档中去除超出给定阈值的所有级别,而不管结构如何?
输入:
<a att="1">
<b/>
<c bat="2">
<d/>
</c>
</a>
输出,级别=1:
<a att="1"/>
输出,级别=2:
<a att="1">
<b/>
<c bat="2"/>
</a>
我尝试过 XPath,但无法限制级别。
在 XSLT 中非常简单:
<xsl:template match="*">
<xsl:if test="count(ancestor::*) <= $level">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:if>
</xsl:template>
在 XQuery 中它几乎与在 XSLT 中相同:
copy $output := $input
modify delete nodes $output//node()[count(ancestor::*) eq $level]
return $output
或者不使用 XQuery 更新,再次解构树并将其组合在一起,直到达到最大级别:
declare function local:limit-level($element as element(), $level as xs:integer) {
if ($level gt 0)
then
element {node-name($element)} {
$element/@*,
(
for $child in $element/node()
return local:limit-level($child, $level - 1)
)
}
else ()
};
local:limit-level(/*, 2)