2

是否有一种简单的方法(可能使用 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,但无法限制级别。

4

3 回答 3

3

在 XSLT 中非常简单:

<xsl:template match="*">
  <xsl:if test="count(ancestor::*) &lt;= $level">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:if>
</xsl:template>
于 2012-06-12T16:18:03.227 回答
3

在 XQuery 中它几乎与在 XSLT 中相同:

copy $output := $input
modify delete nodes $output//node()[count(ancestor::*) eq $level]
return $output

用 zorba 试试

于 2012-06-12T17:44:52.593 回答
2

或者不使用 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)
于 2012-06-12T17:57:47.860 回答