Gremo
05-03-2008, 14:25
Ciao!!!
ho una struttura XML di questo tipo:
<object id="o1">
<refs>
<ref id="o2" />
</refs>
</object>
<object id="o2">
<refs>
<ref id="o1" />
</refs>
</object>
<object id="o3">
<refs>
<ref id="o2" />
</refs>
</object>
un oggetto può avere zero o più riferimenti ad altri oggetti. Può riferire anche se stesso.
L'idea è quella di una trasformazione in SQL, inserendo prima gli oggetti "riferiti" e poi quelli che "riferiscono" (tabella con relazione 1 a molti)
Ho pensato quindi ad un template ricorsivo, di questo tipo:
<xsl:template name="insertObject">
<!-- se ha dei riferimenti, chiama ancora questo template -->
<!-- se non ha riferimenti, chiama questo template sul fratello destro-->
</xsl:template>
Problemi
- in presenza di un ciclo o1 -> o2 -> o1 la ricorsione è infinita: come faccio a dire "se incontri un nodo che fa già parte del ciclo devi terminare"? Non c'è un modo di implementare una lista di nodi già processati?
- un riferimento a se stesso lo escluderei facilmente (ref/@id =! @id)
ho una struttura XML di questo tipo:
<object id="o1">
<refs>
<ref id="o2" />
</refs>
</object>
<object id="o2">
<refs>
<ref id="o1" />
</refs>
</object>
<object id="o3">
<refs>
<ref id="o2" />
</refs>
</object>
un oggetto può avere zero o più riferimenti ad altri oggetti. Può riferire anche se stesso.
L'idea è quella di una trasformazione in SQL, inserendo prima gli oggetti "riferiti" e poi quelli che "riferiscono" (tabella con relazione 1 a molti)
Ho pensato quindi ad un template ricorsivo, di questo tipo:
<xsl:template name="insertObject">
<!-- se ha dei riferimenti, chiama ancora questo template -->
<!-- se non ha riferimenti, chiama questo template sul fratello destro-->
</xsl:template>
Problemi
- in presenza di un ciclo o1 -> o2 -> o1 la ricorsione è infinita: come faccio a dire "se incontri un nodo che fa già parte del ciclo devi terminare"? Non c'è un modo di implementare una lista di nodi già processati?
- un riferimento a se stesso lo escluderei facilmente (ref/@id =! @id)