你的要求不完全清楚,但讓我們給它一個嘗試:
<xsl:template match="/root">
<xsl:copy>
<!-- each first following sibling after <key> -->
<xsl:apply-templates select="key/following-sibling::list[1]" />
</xsl:copy>
</xsl:template>
<xsl:template match="list">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="value">
<row>
<!-- the key immediately before the current <list> -->
<xsl:copy-of select="ancestor::list/preceding-sibling::key[1]" />
<xsl:copy-of select="." />
</row>
</xsl:template>
該代碼假設您對XSLT有基本的瞭解。並且假定我的理解是list
元素直接位於key
元素的前面,並且每個row/value
變爲row
,其中value
和前面的key
。
你標記你的問題XSLT 2.0,但是這個代碼與任何XSLT 1.0或2.0的工作(在這種特殊情況下也不會,如果你嘗試使用2.0的功能非常不同)。
與1.0(.NET)和兩個2.0(Exselt和撒克遜)處理器對以下修改的輸入測試:
<root>
<key>1</key>
<list>
<value>1</value>
<value>2</value>
</list>
<key>2</key>
<list>
<value>55</value>
<value>66</value>
<value>77</value>
</list>
</root>
在下面的輸出得到的:
<root>
<row>
<key>1</key>
<value>1</value>
</row>
<row>
<key>1</key>
<value>2</value>
</row>
<row>
<key>2</key>
<value>55</value>
</row>
<row>
<key>2</key>
<value>66</value>
</row>
<row>
<key>2</key>
<value>77</value>
</row>
</root>
你的假設是完美。我只是想將一個鍵與每個值在它自己的列表中進行配對,然後將它們中的每一個重命名爲一行。它就像從一個鍵映射到列表移動到一個鍵值對列表。 找到了另一種方法做到這一點,將盡快分享。 –
@fsdje很高興聽到這個消息,很高興它有幫助 – Abel