Devuelve la estructura XML hasta el nivel n

¿Existe una forma sencilla, posiblemente con herramientas de línea de comandos de código abierto en Linux, para eliminar todos los niveles más allá de un umbral determinado de un documento XML determinado, independientemente de la estructura?

Entrada:

<a att="1">
   <b/>
   <c bat="2">
      <d/>
   </c>
</a>

Salida, nivel=1:

<a att="1"/>

Salida, nivel=2:

<a att="1">
   <b/>
   <c bat="2"/>
</a>

Probé XPath pero no pude restringir el nivel.

preguntado el 12 de junio de 12 a las 15:06

3 Respuestas

Muy simple en 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>

Respondido el 12 de junio de 12 a las 17:06

Gracias. Funciona para mí después de agregar un <xsl:stylesheet ...> declaración. - krlmlr

En XQuery es casi lo mismo que en XSLT:

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

pruebalo con zorba

Respondido el 12 de junio de 12 a las 18:06

O sin XQuery Update, deconstruya y vuelva a armar el árbol hasta alcanzar el nivel máximo:

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)

Respondido el 12 de junio de 12 a las 18:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.