Vorrei sapere come spostare i nodi di un livello utilizzando XSLT se sono soddisfatte determinate condizioni. Per fare un esempio dare un'occhiata al seguente sorgente XML:XSLT: Spostare il nodo di livello superiore su
<Settings>
<String [...]>
<Boolean [...]/>
</String>
</Settings>
Questo è il file XML che ho come punto di partenza la situazione. Per essere chiari, i nomi dei nodi "Impostazioni", "Stringa", "Booleano" sono nodi speciali che abbiamo definito.
Il problema è che i nodi "booleani" non sono consentiti all'interno dei nodi "String". Ecco perché devo spostare quei nodi "booleani" al livello superiore. L'XML desiderato sarebbe simile a questa:
<Settings>
<String [...]></String>
<Boolean [...]/>
</Settings>
Il XSLT ha anche a lavorare con ogni nodo stringa che ha un nodo booleano pari livello, indipendentemente dalla posizione in XML-albero.
Finora ho imparato che si deve prima copiare tutti i tuoi XML utilizzando una "regola identità" e quindi applicare alcune regole speciali per le trasformazioni desiderate:
<?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>
La cosa sto lottando con la regola per spostare tutti i nodi "booleani" che sono fratelli di nodi "String" un livello in alto. Come lo posso fare?!?
Buona domanda, +1. Vedi la mia risposta per una variazione del modello di progettazione "sovrascrivi la regola dell'identità": ho fornito un override leggermente più accurato. :) –