我是XSLT的新手。以下模板应该用于连接具有相同item_group_id的许多产品的颜色。
<xsl:template name="find-colors" mode="concat">
<xsl:param name="param_item_group_id" />
<xsl:param name="products" />
<xsl:for-each select="$products/product">
<xsl:if test="item_group_id = $param_item_group_id">
<xsl:value-of select="concat($param_item_group_id,\'-\',item_group_id,\'-\', color,\', \')" />
</xsl:if>
</xsl:for-each>
</xsl:template>
在调用模板中,item_group_id设置为$ param_item_group_id。连接本身很有用,但我似乎无法找到制作方法
<xsl:if test="item_group_id = $param_item_group_id">
的工作。该语句始终为true,因此在此模板的输出中也存在这些类型的字符串
354655-354655-green, 54655-354632-red, 354655-354632-green
它应该只是
354655-354655-green
谢谢,
彼得
修改
最终解决方案(改编自JLRis所建议的)是使用
<xsl:if test="item_group_id[position()] = $param_item_group_id[position()]">
映射两个数组的值。
答案 0 :(得分:2)
我可以看到两种可能的解释:
$param_item_group_id
包含多个节点。product
个item_group_id
:例如,如果$param_item_group_id
看起来像这样:
[1] - <someNode>54655<someNode>
[2] - <someNode>354632<someNode>
你有product
这样:
<product>
<item_group_id>354632</item_group_id>
<name>widgets</name>
<color>periwinkle</color>
</product>
比较将评估为true
(因为它们具有共同的值),value-of
将产生54644-354632-periwinkle
(因为“54655”是{$param_item_group_id
中的第一个节点值1}})。在相反的情况下($param_item_group_id
中的一个节点和item_group_id
中的多个product
),可能会发生同样的事情。
这是唯一的猜想。我需要查看您的源XML和更多XSLT,以提供更自信的答案或帮助您解决问题。
我希望这可以防止那些不协调的输出:
<xsl:if test="item_group_id[1] = $param_item_group_id[1]">
但我怀疑存在一个更深层次的问题,这无法解决。
从评论中澄清您的问题:
XPath中的相等运算符与许多其他语言中的相等不同。假设A
或B
或两者都是节点集,如果A = B
中的任何值等于A将为真> B
中任何的值。因此,我上面的描述。
关于这个问题:
如果我要拧,请纠正我,但是如果它是一个阵列则不应该显示,对吧?
会显示。将节点集传递给concat()
会将其转换为字符串值,并且节点集的字符串值是其第一个节点的字符串值。如果$param_item_group_id
中第一个节点的值为54644,那么这就是显示的值。
我认为$param_item_group_id
表现出一些你没有固定下来的行为,而且你的制作方式可能存在问题。我建议尝试以下内容来仔细研究这个变量的内容:
<xsl:value-of select="concat('param_item_group_id contains ',
count($param_item_group_id),
' nodes.')" />
<xsl:for-each select="$param_item_group_id">
<xsl:value-of select="concat(., ', ')" />
</xsl:for-each>