Me gustaría saber cómo mover los nodos hasta un nivel usando XSLT si se cumplen ciertas condiciones. Para dar un ejemplo echar un vistazo a la siguiente fuente XML:XSLT: Mueva el nodo un nivel hacia arriba
<Settings>
<String [...]>
<Boolean [...]/>
</String>
</Settings>
Ese es el XML que tengo como situación de partida. Para ser claros, los nombres de nodo "Configuración", "Cadena", "Booleano" son nodos especiales que definimos.
El problema es que los nodos "booleanos" no están permitidos dentro de los nodos "String". Es por eso que tengo que mover esos nodos "booleanos" en el nivel superior. El XML deseado se vería así:
<Settings>
<String [...]></String>
<Boolean [...]/>
</Settings>
el XSLT también tiene que trabajar con cada nodo de cadena que tiene un nodo de Boole hermanos, independientemente de la posición en el XML-árbol.
Hasta ahora he aprendido que tienes que copiar primero la totalidad de su XML usando una "regla de identidad" y luego aplicar algunas reglas especiales para las transformaciones deseadas:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<!-- Identity rule -->
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<!-- special rules ... -->
</xsl:stylesheet>
Lo estoy luchando con es la rule para mover todos los nodos "Boolean" que son hermanos de los nodos "String" de un nivel arriba. ¿¡¿Cómo puedo hacer eso?!?
Buena pregunta, +1. Consulte mi respuesta para ver una variación del patrón de diseño "anular la regla de identidad": proporcioné una anulación ligeramente más precisa. :) –