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>