为什么for-each不能始终如一?

时间:2011-03-27 00:48:36

标签: xslt

当我使用

<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表中会有两行。从第二个场景输出以下内容,其中我所做的全部是从plm:ProductRevision选择值中取for-each并将其附加到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>

但是如上所示,它不会输出所需的代码。任何人都可以做的任何事情来帮助我理解这一点将不胜感激。如果需要任何其他信息,请告知我,我会立即提供。谢谢!

3 个答案:

答案 0 :(得分:1)

第一个表达式遍历每个plm:PLMXML/plm:ProductRevision,我猜你有两个(或三个)。第二个表达式遍历每个plm:PLMXML,我猜你只有一个(或者两个)。

这些不是等效的表达方式。它们循环不同的结构。 for-each的正文将为select匹配的集合中的每个节点运行一次。您的select表达式不同,因此它们匹配的内容数量可能会有所不同,而不管for-each正文中包含的其他内容。

答案 1 :(得分: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>

然后第一次转换的结果与完全相同。

答案 2 :(得分:0)

第二个案件的开始:

plm:ProductRevision / plm:UserData

选择所有plm:ProductRevision元素下的所有plm:UserData元素。

(看起来输出中有两个这样的元素。)

然后表达式继续在所有这些UserData元素中找到第一个UserValue。

最后输出所有这些UserValue元素的@value属性。

这就是你在单个td中看到“Make Make”的原因。