如何使用XSLT將具有相同名稱和相同屬性的所有同級元素合併到單個元素中?這個轉換也應該遞歸地應用於正被合併的元素的子元素。這是源文件:在XSLT中遞歸地組合相同的同級元素
<?xml version="1.0"?>
<Root>
<Element id="UniqueId1">
<SubElement1/>
<SubElement2>
<LeafElement1/>
</SubElement2>
</Element>
<Element id="UniqueId1">
<SubElement2>
<LeafElement1/>
<LeafElement2/>
</SubElement2>
<SubElement3/>
</Element>
<Element id="UniqueId2">
<SubElement1/>
<SubElement4/>
</Element>
</Root>
應該被變換爲:
<?xml version="1.0"?>
<Root>
<Element id="UniqueId1">
<SubElement1/>
<SubElement2>
<LeafElement1/>
<LeafElement2/>
</SubElement2>
<SubElement3/>
</Element>
<Element id="UniqueId2">
<SubElement1/>
<SubElement4/>
</Element>
</Root>
具有相同名稱的任何元素和屬性被組合爲一個元件。然後,他們的孩子進行檢查。如果它們中的任何一個具有相同的名稱和相同的屬性,則它們被組合。這個轉換被遞歸地應用於所有元素。
編輯:爲了澄清,所有這些條件必須爲兩個要合併的元素。
- 它們具有相同的元件名稱
- 它們具有相同的屬性
- 每個相應屬性的值是相同的
- 它們是兄弟姐妹(遞歸地應用,因此,任何相同父元素被合併和合並前,他們的孩子被認爲是)
這些元素是相同的,應當合併:
<Item/>
和<Item/>
(相同的名稱,相同屬性)<Item Attr="foo"/>
和<Item Attr="foo"/>
(相同的名稱,相同屬性)
這些元素是不相同的,並且不應該被合併:
<Item/>
和<SubItem/>
(不同的名稱)<Item Attr="foo"/>
和<Item/>
(不同屬性)<Item Attr="foo"/>
和<Item Attr="bar"/>
(不同的屬性值)
該問題看起來有點不確定。在「元素」情況下,您在id屬性上匹配,但在子元素上匹配標記名本身。子子元素呢? – 2009-11-05 20:18:45
感謝您的評論,我添加了一個更明確的元素何時合併的定義。我希望這回答了你的問題。 – Chris 2009-11-05 20:42:31