no estoy seguro si esto es posible sin tener que pasar por varios pasos, pero voy a preguntar de todos modos (mi XSL es un poco oxidado)XSLT para saltar nodos ya "visitados"
tengo un documento XML, el cual contiene nodos de la siguiente manera: (El archivo real contiene una gran cantidad de variables de estructura, que interdependencias, ninguno de los cuales son circulares)
<structures>
<structure id="STRUCT_A">
<field idref="STRUCT_B" name="b"/>
<field idref="STRUCT_C" name="c"/>
<field idref="FIELD_D" name="d"/>
</structure>
<structure id="STRUCT_B">
<field idref="STRUCT_C" name="c"/>
<field idref="FIELD_E" name="e"/>
</structure>
<structure id="STRUCT_C">
<field idref="FIELD_E" name="e"/>
<field idref="FIELD_F" name="f"/>
<field idref="FIELD_G" name="g"/>
</structure>
</structures>
lo que quiero hacer es generar un poco de texto (en este caso C++ struct
s), y el requisito obvio es la orden de f los struct
s, por lo que mi salida ideal sería
struct STRUCT_C
{
FIELD_E e;
FIELD_F f;
FIELD_G g;
};
struct STRUCT_B
{
STRUCT_C c;
FIELD_E e;
};
struct STRUCT_A
{
STRUCT_B b;
STRUCT_C c;
FIELD_D d;
};
Sé que podría utilizar hacia adelante las declaraciones y que significaría que el orden no es importante, sin embargo, el problema es que no habrá "procesamiento" código en línea en las estructuras, y requerirían la definición real para estar presente.
Hasta ahora puedo detectar a ver si un structure
tiene ninguna dependencia, con el siguiente segmento de XSL:
<xsl:for-each select="descendant::*/@idref">
<xsl:variable name="name" select="."/>
<xsl:apply-templates select="//structure[@id = $name]" mode="struct.dep"/>
</xsl:for-each>
(esto ocurre dentro de un <xsl:template match="structure">
)
Ahora, en teoría, podría entonces siga esta "cadena" de dependencia y genere el struct
s para cada entrada primero, luego la que estoy actualmente, sin embargo, como se puede imaginar, esto genera muchas copias de la misma estructura, que es un dolor ...
¿Hay alguna forma de evitar las copias? Básicamente, una vez que se ha visitado una estructura, y si volvemos a visitarla, no nos molestamos en mostrar el código para ello ... No necesito el xslt completo para hacerlo (¡a menos que sea trivial!), Pero simplemente cualquier idea sobre enfoques ...
Si no lo hay, yo podría, en teoría, envolver el struct
con un guardia #ifdef
/#define
/#endif
para que el compilador sólo utiliza la primera definición, sin embargo, esto es muy desagradable! :(
(NOTES: XSLT 1.0, xsltproc en Linux: Usando libxml 20623, 10115 y libxslt libexslt 812)
excelente pregunta, 1. Vea mi respuesta para una solución completa y breve. :) –