[英]XSLT 1.0 - Merge sibling nodes with child nodes into new composite nodes
[英]XSLT: Merge child elements of sibling nodes
我對XSLT有點陌生,但是我試圖將同級節點的子元素合並到包含所有數據的單個節點中。
因此,例如,我的數據結構如下所示:
<root>
<item>
<child index="0">
<data>fooA</data>
<data>fooB</data>
<data>fooC</data>
<data>fooD</data>
</child>
<child index="1">
<data>foo1</data>
<data>foo2</data>
<data>foo3</data>
<data>foo4</data>
</child>
</item>
<item>
<child index="0">
<data>barE</data>
<data>barF</data>
<data>barG</data>
<data>barH</data>
</child>
<child index="1">
<data>bar5</data>
<data>bar6</data>
<data>bar7</data>
<data>bar8</data>
</child>
</item>
</root>
我想像這樣轉換它:
<root>
<item>
<child index="0">
<data>fooA</data>
<data>fooB</data>
<data>fooC</data>
<data>fooD</data>
<data>barE</data>
<data>barF</data>
<data>barG</data>
<data>barH</data>
</child>
<child index="1">
<data>foo1</data>
<data>foo2</data>
<data>foo3</data>
<data>foo4</data>
<data>bar5</data>
<data>bar6</data>
<data>bar7</data>
<data>bar8</data>
</child>
</item>
</root>
因此,我認為我需要以某種方式對索引進行分組,然后僅選擇每個元素,但是我不確定如何做到這一點。
提前致謝...
這可能有效,或者至少讓您開始:
<xsl:for-each select="//item[1]/child">
<xsl:element name="child">
<xsl:attribute name="index"><xsl:value-of select="@index" /></xsl:attribute>
<xsl:for-each select="//item/child[@index=@index]/*">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
但是,一般而言,XSL並非最適合參數化操作。 如果interal for不起作用,您還可以嘗試使用param運行xsl:call-template
。
還要注意, xsl:copy
不能與太多的XSL引擎一起很好地工作,因此您可能需要使用其他東西(例如,使用apply-templates
和為元素編寫模板)。
我最終使用了Muenchian分組 ,對我來說效果很好。
Muenchian分組的示例...
XML輸入
<root>
<item>
<child index="0">
<data>fooA</data>
<data>fooB</data>
<data>fooC</data>
<data>fooD</data>
</child>
<child index="1">
<data>foo1</data>
<data>foo2</data>
<data>foo3</data>
<data>foo4</data>
</child>
</item>
<item>
<child index="0">
<data>barE</data>
<data>barF</data>
<data>barG</data>
<data>barH</data>
</child>
<child index="1">
<data>bar5</data>
<data>bar6</data>
<data>bar7</data>
<data>bar8</data>
</child>
</item>
</root>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="childByIndex" match="child" use="@index"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root">
<root>
<item>
<xsl:for-each select="item/child[count(.|key('childByIndex',@index)[1])=1]">
<child>
<xsl:apply-templates select="@*|key('childByIndex',@index)/*"/>
</child>
</xsl:for-each>
</item>
</root>
</xsl:template>
</xsl:stylesheet>
XML輸出
<root>
<item>
<child index="0">
<data>fooA</data>
<data>fooB</data>
<data>fooC</data>
<data>fooD</data>
<data>barE</data>
<data>barF</data>
<data>barG</data>
<data>barH</data>
</child>
<child index="1">
<data>foo1</data>
<data>foo2</data>
<data>foo3</data>
<data>foo4</data>
<data>bar5</data>
<data>bar6</data>
<data>bar7</data>
<data>bar8</data>
</child>
</item>
</root>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.