2011-03-27 334 views
0

當我使用爲什麼for-each不一致?

<xsl:for-each select="plm:PLMXML/plm:ProductRevision> 

和價值的作爲

<td><xsl:value-of select="plm:UserData/plm:UserValue[1]/@value"/></td> 

如下網頁,我使用xsl形成完美的作品。但是當我使用

<xsl:for-each select="plm:PLMXML> 

,並在

<td> 
    <xsl:value-of 
     select="plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"/> 
</td> 

一種價值的網頁我創建不再正常形成。

在第一種情況下,HTM輸出這樣的:

<body> 
     <h2>My CD Collection</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd33"> 
      <th>Category Type</th> 
      <th>DS Def. Modified?</th> 
      <th>DS Def Verified?</th> 
      <th>Designation</th> 
      <th>Hazardous</th> 
      <th>test column</th> 
      <th>Make/Buy</th> 
      <th>Packaging</th> 
     </tr> 
     <tr> 
      <td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td>Make</td> 
       <td></td> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td></td> 
       <td>Make</td> 
       <td></td> 
      </td> 
     </tr> 
     </table> 
    </body> 
</html> 

這僅僅是理所應當的。 htm表中將有兩行。以下是第二種情況的輸出,其中我所做的所有操作都是從for-each選擇值取plm:ProductRevision,並將其附加到value-of select語句的開頭。這兩個應該是同義詞嗎?這是完成後的輸出。

<html xmlns:plm="http://www.plmxml.org/Schemas/PLMXMLSchema" xmlns:plmxml_cl="http://www.plmxml.org/Schemas/PLMXMLClassificationSchema"> 
    <body> 
     <h2>My CD Collection</h2> 
     <table border="1"> 
     <tr bgcolor="#9acd33"> 
      <th>Category Type</th> 
      <th>DS Def. Modified?</th> 
      <th>DS Def Verified?</th> 
      <th>Designation</th> 
      <th>Hazardous</th> 
      <th>test column</th> 
      <th>Make/Buy</th> 
      <th>Packaging</th> 
     </tr> 
     <tr> 
      <td> 
       <td> </td> 
       <td> </td> 
       <td> </td> 
       <td> </td> 
       <td> </td> 
       <td>Make Make</td> 
       <td> </td> 
      </td> 
     </tr> 
     </table> 
    </body> 
</html> 

請幫我理解爲什麼。我需要做第二種方式的原因是我有來自plm:PLMXML的父節點下的不同節點的值。換句話說,我有下PLM值:PLMXML/PLM:ProductRevision和下PLM:PLMXML/plmxml_cl:ICO所以我想使用

<xsl:for-each select="plm:PLMXML> 
<tr> 
<td> 
    <xsl:value-of 
     select="plm:ProductRevision/plm:UserData/plm:UserValue[2]/@value"/> 
</td> 
<td> 
    <xsl:value-of 
     select="plmxml_cl:ICO/plmxml_cl:Property[@attributeId='3000011']/plmxml_cl:Value"/> 
</td> 
</tr> 
</for-each> 

然而如上所示它不輸出期望的代碼。任何人都可以幫助我理解這一點,將不勝感激。如果需要任何其他信息,請通知我,我會立即提供。謝謝!

+0

@ user678526 - 我已經給出了答案,但如果您提供示例輸入(即您的實際源文檔),我會更容易判斷我是否正確。 – 2011-03-27 01:04:12

+0

好問題,+1。請參閱我的答案以獲取更多解釋。 – 2011-03-27 15:49:16

回答

1

第一個表達式循環遍歷每個plm:PLMXML/plm:ProductRevision,其中我猜你有兩個(或三個)。第二個表達式遍歷每個plm:PLMXML,其中我猜你只有一個(或者兩個)。

這些不是等價的表達式。他們循環不同的構造。對於由select匹配的集合中的每個節點,for-each的主體將運行一次。您的select表達式是不同的,因此它們匹配的事件數量可能會不同,無論for-each正文中包含的其他內容如何。

+0

+1顯然是正確的。 – 2011-03-27 15:00:30

1

除了由@lwburk正確的答案,這種行爲是通過以下事實<xsl:value-of select="someExpression">只輸出由someExpression所選第一節點的字符串值引起的。

我的猜測是,如果在第二種情況下更換

<xsl:value-of   
    select="plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"/> 

<xsl:for-each select= 
     "plm:ProductRevision/plm:UserData/plm:UserValue[1]/@value"> 
     <xsl:value-of select="."/> 
    </xsl:for-each> 

那麼結果將是完全一樣與第一次轉型。

0

你的第二個案例的開始:

PLM:ProductRevision/PLM:的UserData

選擇將所有的PLM:在所有的PLM的UserData元素:ProductRevision元素。

(它看起來像有兩個從輸出這些元素。)

表達然後繼續尋找第一個UserValue在所有這些的UserData元素。

最後,輸出所有這些UserValue元素的@value屬性。

這就是爲什麼您在單個td中看到「Make Make」。