2013-02-01 84 views
0

我對XSLT相當陌生。以下模板應該用於連接具有相同item_group_id的許多產品的顏色。將xsl參數與xsl中的值進行比較if子句

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

來映射兩個數組的值。

+1

你能分享你的輸入XML,也許是調用這個模板的XSL?單個「」可能有多個「」子節點嗎? – JLRishe

回答

1

我可以看到兩個可能的解釋是:

  1. $param_item_group_id包含多個節點。
  2. product s的多個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中的第一個節點值)。在相反的情況下($param_item_group_id中的一個節點和product中的多個item_group_id),可能會發生同樣的情況。

這只是猜測。我需要查看源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> 
+0

嗨JL,謝謝。我的XML看起來非常像您的示例,但每個只有一個 - 實際上54644-354632-periwinkle中的54644是生成的XML中$ param_item_group_id的值 - 如果我正在擰,請更正此值,但這應該不顯示,如果它是一個數組,對嗎?此外,我不明白如果「$ param_item_group_id中的一個值」等於目前的中的item_group_id的值,if-clause可能是真的。無論如何,我已經改變了代碼來測試item_group_id [1] = $ param_item_group_id [1],它可以無障礙地工作。再次感謝! – Peavey

+0

@Peavey很高興幫助。我在上面添加了更多解釋。 – JLRishe

+0

謝謝。我 - 再次 - 忘記了XSLT是聲明性的而不是程序性的。當然,item_group_id和$ param_item_group_id都是數組。我終於通過使用來解決問題> – Peavey