当我使用
时<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>
但是如上所示,它不会输出所需的代码。任何人都可以做的任何事情来帮助我理解这一点将不胜感激。如果需要任何其他信息,请告知我,我会立即提供。谢谢!
答案 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”的原因。