将xsl param与xsl if子句中的值进行比较

时间:2013-02-01 17:23:47

标签: xml xslt if-statement

我是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()]">

映射两个数组的值。

1 个答案:

答案 0 :(得分:2)

我可以看到两种可能的解释:

  1. $param_item_group_id包含多个节点。
  2. productitem_group_id
  3. 例如,如果$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中的相等运算符与许多其他语言中的相等不同。假设AB或两者都是节点集,如果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>