Estoy tratando de dividir un árbol de elementos según la ubicación de un elemento descendiente. (En particular, estoy tratando de analizar IDML de Adobe.) Me gustaría ser capaz de convertir un árbol que se parece a:XSLT dividió un árbol en un nodo descendente
<ParagraphStyleRange style="foo">
<CharacterStyleRange style="bar">
<Content>foo</Content>
<Br />
<Content>bar</Content>
</CharacterStyleRange>
<CharacterStyleRange style="bop">
<Content>baz</Content>
<Br />
<Hyperlink>
<Content>boo</Content>
<Br />
<Content>meep</Content>
</Hyperlink>
</ParagraphStyleRange>
en árboles intermedios:
<ParagraphStyleRange style="foo">
<CharacterStyleRange style="bar">
<Content>foo</Content>
</CharacterStyleRange>
</ParagraphStyleRange>
<ParagraphStyleRange style="foo">
<CharacterStyleRange style="bar">
<Content>bar</Content>
</CharacterStyleRange>
<CharacterStyleRange style="bop">
<Content>baz</Content>
</CharacterStyleRange>
</ParagraphStyleRange>
<ParagraphStyleRange style="foo">
<CharacterStyleRange style="bop">
<Hyperlink>
<Content>boo</Content>
</Hyperlink>
</CharacterStyleRange>
</ParagraphStyleRange>
<ParagraphStyleRange style="foo">
<CharacterStyleRange style="bop">
<Hyperlink>
<Content>meep</Content>
</Hyperlink>
</CharacterStyleRange>
</ParagraphStyleRange>
que puedo luego analizar usando XSL normal. (EDITAR: Originalmente mostré las etiquetas <Br/>
en su lugar original, pero en realidad no importa si están allí o no, ya que la información que contenían ahora está representada por los elementos divididos. Creo que es probablemente más fácil resolver este problema sin preocuparse de mantenerlos en.)
he intentado utilizar xsl:for-each-group
como se sugiere en la especificación XSLT 2.0 (por ejemplo <xsl:for-each-group select="CharacterStyleRange/*" group-ending-with="Br">
), pero no puedo encontrar la manera de aplicar que en cada nivel del árbol (pueden aparecer <Br />
etiquetas en cualquier nivel, por ejemplo, dentro de un elemento <Hyperlink>
dentro de un elemento <CharacterStyleRange>
, y también me limita a tener plantillas que se aplican a la profundidad elegida.
EDITAR: Mi ejemplo de bacalao e muestra solo un lugar donde el árbol necesita ser dividido, pero puede haber cualquier número de puntos de división (siempre el mismo elemento, sin embargo)
EDIT 2: He añadido algunos ejemplos más detallados, para mostrar algunas de las complicaciones.
Buena pregunta, +1. Vea mi respuesta para una solución completa, breve y fácil. :) –
+1 buena pregunta. :-) – LarsH
Fue difícil de encontrar, pero aquí está el duplicado http://stackoverflow.com/questions/3863274/move-separator-elements-upwards-in-xml-hierarchy –