for ciclo bucles anidados xslt scope for-loop

xslt - ciclo - bucles anidados c++



¿Cómo accedo a los elementos del bucle externo desde dentro de los bucles anidados? (3)

He anidado xsl: for loops:

<xsl:for-each select="/Root/A"> <xsl:for-each select="/Root/B"> <!-- Code --> </xsl:for> </xsl:for>

Desde dentro del bucle interno, ¿cómo puedo acceder a los atributos desde el nodo actual en el bucle externo?

Me sigo encontrando escribiendo código como este:

<xsl:for-each select="/Root/A"> <xsl:variable name="someattribute" select="@SomeAttribute"/> <xsl:for-each select="/Root/B"> <!-- Now can use $someattribute to access data from ''A'' --> </xsl:for> </xsl:for>

Esto no se escala muy bien, ya que a veces necesito acceder a varias piezas de información y terminar creando una variable para cada pieza. hay una manera mas facil?


Lo siguiente también podría ser utilizado:

<xsl:for-each select="ns:attribute"> <name><xsl:value-of select="ns:name" /></name> <xsl:for-each select="ns:value"> <value><xsl:value-of select="."/></value> </xsl:for-each> </xsl:for-each>

Para analizar el documento XML ...

<ns:attribute> <ns:name>name</ns:name> <!--1 or more repetitions:--> <ns:value>Rahul</ns:value> <ns:value>Sushovan</ns:value> </ns:attribute>


Puede almacenar la estructura completa / Root / A en una variable y hacer referencia a esa variable en lugar de crear una nueva variable para cada atributo y subelemento al que necesite acceder.

<xsl:for-each select="/Root/A/"> <xsl:variable name="ROOT_A" select="."/> <xsl:for-each select="/Root/B/"> <!-- Variable is accessed like this: $ROOT_A/@someAttribute Just like a normal XML node --> </xsl:for-each> </xsl:for-each>


ha respondido bien, pero solo para notar que parece estar haciendo una combinación de cartesión (cruzada), ¿es eso intencional? Si está intentando hacer una unión regular (con un predicado, etc.), querrá buscar en <xsl:key/> , es decir, declarar una clave:

<xsl:key name="BIndex" match="/Root/B" use="SomeChildNode"/>

luego consume en tu predicado:

<xsl:for-each select="/Root/A/"> <xsl:variable name="ROOT_A" select="."/> <xsl:for-each select="key(''BIndex'', LocalNode)"> <!-- --> </xsl:for-each> </xsl:for-each>

Esto debería ser equivalente a (pero mucho más rápido que) el predicado:

<xsl:for-each select="/Root/B[SomeChildNode = current()/LocalNode]">

Si está agrupando los datos, mire la agrupación Muenchian