Xslt 为什么for-each不能始终如一地工作?

Xslt 为什么for-each不能始终如一地工作?,xslt,Xslt,当我使用 <xsl:for-each select="plm:PLMXML/plm:ProductRevision> 请帮我理解为什么。我需要使用第二种方法的原因是,我从plm:PLMXML的父节点下不同的节点获取值。换句话说,我在plm:PLMXML/plm:ProductRevision下有值,在plm:PLMXML/PLMXML_cl:ICO下有值,所以我想使用 <xsl:for-each select="plm:PLMXML> <tr> <td

当我使用

<xsl:for-each select="plm:PLMXML/plm:ProductRevision>
请帮我理解为什么。我需要使用第二种方法的原因是,我从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>

第一个表达式在每个
plm:PLMXML/plm:ProductRevision
上循环,我猜您有两个(或三个)。第二个表达式在每个
plm:PLMXML
上循环,我猜您只有一个(或者两个)


这些不是等价的表达式。它们在不同的构造上循环。每个
主体将为与
选择
匹配的集合中的每个节点运行一次。您的
select
表达式是不同的,因此它们匹配的内容的数量可能会不同,无论
正文中为每个

添加了@lwburk的正确答案,此行为是由以下事实造成的:
仅输出由
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>


则结果将与第一次转换时的结果完全相同。

第二种情况的开始:

plm:ProductRevision/plm:UserData

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

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

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

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


这就是为什么您会在单个td中看到“Make Make”。

@user678526-我已经给出了答案,但如果您提供示例输入(即您的实际源文档),则更容易判断我是否正确。好问题,+1。请参阅我的答案以获得更多解释。
<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>
<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>
<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>
<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>