2015-03-31 135 views
0

我有這樣的XML:XSLT - 遍歷節點集

<root> 
<row> 
    <col name="col1">&lt;root&gt;&lt;row&gt;&lt;col name=&quot;COL_NAME_1&quot;&gt;col_value_1&lt;/col&gt;;&lt;/row&gt;&lt;/root&gt;</col> 
    <col name="col2">&lt;root&gt;&lt;row&gt;&lt;col name=&quot;COL_NAME_2&quot;&gt;col_value_2&lt;/col&gt;;&lt;/row&gt;&lt;/root&gt;</col> 
</row></root> 

我需要從COL1獲得逃脫收集,並通過其行迭代。 我正在使用exsl:node-set函數。這是我簡單的xsl:

<xsl:template match="/"> 
<xsl:variable name="collection" select="exsl:node-set(./root/row/col[@name='col1'])" disable-output-escaping="yes" /> 
<xsl:for-each select="($collection)/root/row"> 
    <!-- ... --> 
</xsl:for-each></xsl:template> 

我可以使用XSL正確讀取從變量$收藏價值:價值的功能,但如果沒有行,我不能迭代它。任何想法我做錯了什麼?

+1

您正在使用哪種處理器? – 2015-03-31 15:33:27

回答

1

如果此XML的作者希望您在col元素內看到諸如root和row之類的元素,則它們不會轉義尖括號。因爲他們逃脫了,這裏沒有結構,只有文字。從文本中獲取結構的操作稱爲解析。 XSLT 3.0有一個函數parse-xml()來解析文本並創建一個樹結構;早期版本不支持,儘管您的供應商可能會提供擴展,或者您可能可以編寫自己的擴展。

0

node-set()函數不解析。您的$collection變量是一個節點集,其中包含一個臨時文檔節點,其中一個子節點爲col

撒克遜有一個名爲parse()的擴展函數,它可以按照您的需要進行操作,就像其他一些XSLT處理器一樣。我也看到了一些在純XSLT中編碼的嘗試,但不知道是否有很好的實現。