我想根据派生元素的位置拆分元素树。 (特别是,我试图解析Adobe的IDML)。我希望能够在树上,看起来像转换:XSLT在后代节点处拆分树
<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 />
标签可以出现在任何级别,如A <CharacterStyleRange>
元素的内部<Hyperlink>
元素中,这也限制了我适用于选定的深度只能有模板
编辑:我的例子鳕鱼e只显示了树需要分割的一个地方,但是可以有任意数量的分割点(总是相同的元素,尽管如此)。
编辑2:我已经添加了一些更详细的示例,以显示一些并发症。
好问题,+1。查看我的回答,获取完整,简短和简单的解决方案。 :) – 2011-02-27 02:43:44
+1好问题。 :-) – LarsH 2011-02-27 03:03:31
这很难找到,但这里是重复的http://stackoverflow.com/questions/3863274/move-separator-elements-upwards-in-xml-hierarchy – 2011-02-28 16:34:44