所以,我有我的手一個非常混亂的問題..XPath的結果是不正確的 - 通過整個XML不會
它使用XPath時,彷彿整個XML數據的層次結構不被搜索過在XSL中表達。
一些虛設XML數據:
<pets name="myPets" NUM="2">
<dog name="allMyDogs" NUM="5">
<dog name="Frank" NUM="3"/>
<dog name="Spot" NUM="4"/>
<dog name="Rover" NUM="1"/>
<dog name="Rupert" NUM="6"/>
<cat name="Lucy" NUM="4"/>
</dog>
<cat name="allMyCats" NUM="4">
<cat name="Simba" NUM="4"/>
<cat name="Princess" NUM="5"/>
<cat name="Fluffy" NUM="1"/>
<cat name="Lucy" NUM="3"/>
<cat name="Lucy" NUM="35"/>
<cat name="Lucy" NUM="6"/>
<cat name="Lucy" NUM="1"/>
</cat>
<cat name="Lucy" NUM="9"/>
</pets>
以下是我相信是造成問題的的XSLT代碼部分:
<xsl:key name="elem_key" match="elem" use="concat(@key, .)" />
<xsl:variable name="all_data">
<xsl:apply-templates select="*">
<xsl:sort select="name()" />
</xsl:apply-templates>
</xsl:variable>
<xsl:template match="//*[@NUM<=4]">
<elem key="{name()}">
<xsl:copy-of select="@*" />
<xsl:for-each select="@*">
<xsl:sort select="name()" />
<attribute>|<xsl:value-of select="name()" />|</attribute>
</xsl:for-each>
</elem>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="msxsl:node-set($all_data)">
<xsl:for-each select="*[generate-id()=generate-id(key('elem_key',concat(@key, .))[1])]">
<table >
<tr>
<td>Element Name</td>
<xsl:for-each select="*">
<td>
<xsl:value-of select="translate(.,'|','')" />
</td>
</xsl:for-each>
</tr>
<xsl:for-each select="key('elem_key', concat(@key, .))">
<xsl:variable name="curr_elem" select="." />
<tr>
<td>
<xsl:value-of select="@key" />
</td>
<xsl:for-each select="*">
<td >
<xsl:value-of select="$curr_elem/@*[name()=translate(current(),'|','')]" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
<p />
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
中的XPath表達式中使用:
//*[@NUM<=4]
(以上應該產生許多成果)
個不正確的結果我得到:
Element Name name NUM
pets myPets 2
正如你可以看到它似乎停止在根。
如果我改變XPath來:
//*[@NUM=4]
我得到這些不正確的結果:
Element Name name NUM
dog Spot 4
Element Name name NUM
cat Lucy 4
Element Name name NUM
cat allMyCats 4
事情似乎發生的是,它會停止搜索分解成層次結構一旦找到了比賽。前兩個(Spot和Lucy)是正確的,但是當allMyCats(Simba)的子節點的NUM爲4時,它停在所有MyCats上。
任何人都可以幫助我修復此代碼,以便它返回正確的結果?我很沮喪! :(
謝謝!
沒有完整的樣式表,我只能猜測...如果var'all_data'被聲明爲樣式表的頂層元素,那麼我建議在'xsl:apply-templates'中使用絕對路徑,如「/ *」 – 2010-08-10 17:30:01
@ Alejandro:是樣式表中的第一個元素,然後是var all_data。我試過路徑「/ *」,但它不影響我的結果。 :( –
developer
2010-08-10 18:20:57
好問題(+1)。請參閱我的回答以解釋問題並獲得簡單的解決方案。:) – 2010-08-10 20:42:42