我想根據派生元素的位置拆分元素樹。 (特別是,我試圖解析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