2015-09-07 55 views
0

XSLT是新手,我只是無法圍繞這個問題進行討論。 我有一個XML如下:XSLT傳播父元素到子列表中的每個子元素

<root> 
    <key>1</key> 
    <list> 
     <value>1</value> 
     <value>2</value> 
    </list> 
</root> 

我想實現這一目標是:

<root> 
    <row> 
     <key>1</key> 
     <value>1</value> 
    </row> 
    <row> 
     <key>1</key> 
     <value>2</value> 
    </row>   
</root> 

回答

1

你的要求不完全清楚,但讓我們給它一個嘗試:

<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> 
+0

你的假設是完美。我只是想將一個鍵與每個值在它自己的列表中進行配對,然後將它們中的每一個重命名爲一行。它就像從一個鍵映射到列表移動到一個鍵值對列表。 找到了另一種方法做到這一點,將盡快分享。 –

+0

@fsdje很高興聽到這個消息,很高興它有幫助 – Abel