Я пытаюсь разбить дерево элементов на основе расположения потомка элемента. (В частности, я пытаюсь проанализировать IDML от Adobe.) Я хотел бы иметь возможность преобразовать дерево, которое выглядит следующим образом:
<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>
на расщепленные деревья:
<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>
, который я могу затем проанализировать, используя обычный XSL. (РЕДАКТИРОВАТЬ: я изначально показывал теги <Br/>
в их первоначальном месте, но на самом деле не имеет значения, есть они там или нет, так как информация, которую они содержали, теперь представлена разделенными элементами. Я думаю, что, вероятно, легче решить эта проблема, не беспокоясь о том, чтобы держать их.)
Я пытался использовать xsl:for-each-group
, как предложено в спецификации XSLT 2.0 (например, <xsl:for-each-group select="CharacterStyleRange/*" group-ending-with="Br">
), но я не могу понять, как применить это на каждом уровне дерева (теги <Br />
могут появляться на любом уровне Например, внутри элемента <Hyperlink>
внутри элемента <CharacterStyleRange>
, и это также ограничивает меня только наличием шаблонов, которые применяются на выбранной глубине.
РЕДАКТИРОВАТЬ: мой пример кода показывает только одно место, где дерево должно быть разделено, но может быть любое количество точек разделения (хотя всегда один и тот же элемент.)
РЕДАКТИРОВАТЬ 2: Я добавил более подробный пример, чтобы показать некоторые из сложностей.