2011-03-27 64 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”。