1

私は 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">

仕事。ステートメントは常に真であるため、このテンプレートの出力にもこれらの種類の文字列が存在します

354655-354655-green, 54655-354632-red, 354655-354632-green

あるべき場所

354655-354655-green

ありがとうございました、

ピーター

編集:

最終的な解決策(JLRisheが提案したものから適応)は使用することです

<xsl:if test="item_group_id[position()] = $param_item_group_id[position()]">

両方の配列の値をマップします。

4

1 に答える 1

2

これには、次の 2 つの説明が考えられます。

  1. $param_item_group_id複数のノードが含まれています。
  2. 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(共通の値を持っているため) と評価され、 ( 「54655」は の最初のノード値であるため)value-ofが生成されます。逆の場合 ( に 1 つのノードがあり、 に複数のノードがある場合)、同じことが起こる可能性があります。54644-354632-periwinkle$param_item_group_id$param_item_group_iditem_group_idproduct

それは単なる推測です。より信頼できる回答を提供したり、問題を解決したりするために、ソース XML と XSLT の詳細を確認する必要があります。

これにより、これらの不調和な出力が防止されると期待しています。

<xsl:if test="item_group_id[1] = $param_item_group_id[1]">

しかし、これでは解決できない根本的な問題があると思われます。

コメントから質問を明確にするには:

XPath の等価演算子は、他の多くの言語の等価演算子とは異なる働きをします。AまたはBその両方がノード セットであると仮定すると、 のいずれかの値が のいずれの値と等しいA = B場合、式は true になります。したがって、上記の私の説明。AB

この質問について:

私が間違っている場合は修正してください。ただし、配列の場合は表示されないはずですよね?

表示されます。ノードセットを渡して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>
于 2013-02-01T17:58:37.800 に答える