【发布时间】:2011-02-26 19:24:12
【问题描述】:
我正在尝试根据后代元素的位置拆分元素树。 (特别是,我正在尝试解析 Adobe 的 IDML。)我希望能够转换如下所示的树:
<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/> 标签,但它们是否存在并不重要,因为它们包含的信息现在由拆分元素表示。我认为这可能更容易解决这个问题,不用担心把它们留在里面。)
我尝试按照 XSLT 2.0 规范中的建议使用xsl:for-each-group(例如<xsl:for-each-group select="CharacterStyleRange/*" group-ending-with="Br">),但我不知道如何在树的每个级别应用它(<Br /> 标签可以出现在任何级别,例如在 <CharacterStyleRange> 元素内的 <Hyperlink> 元素内,这也限制了我只能使用适用于所选深度的模板。
编辑:我的示例代码只显示了一个需要拆分树的地方,但可以有任意数量的拆分点(尽管总是相同的元素。)
编辑 2:我添加了一些更详细的示例,以显示一些复杂性。
【问题讨论】:
-
好问题,+1。请参阅我的答案以获得完整,简短且简单的解决方案。 :)
-
很难找到,但这里是重复的stackoverflow.com/questions/3863274/…
标签: xslt