2013-07-12 120 views
0

我的輸入XML的樣品結構看起來如下:XSLT組由多個節點

<Products> 
    <Product> 
    <ID>Product1</ID> 
    <Extra1></Extra1> 
    <Extra2></Extra2> 
    <Img1>val1</Img1> 
    <Img2>val2</Img2> 
    <Img3>val2</Img3> 
    <Img4>val1</Img4> 
    </Product> 

    <Product> 
    <ID>Product2</ID> 
    <Extra1></Extra1> 
    <Extra2></Extra2> 
    <Img1>val1</Img1> 
    <Img2>val2</Img2> 
    <Img3>val2</Img3> 
    <Img4>val1</Img4> 
    </Product> 
</Products> 

我解析在每個時間product元件,並通過它的值將每一個產品的Img標籤。我正在使用<xsl:key name="keyImg" match="Product/*[contains(local-name(), 'Img')]" use="."/>。但是同一把鑰匙一遍又一遍地被使用。如果兩個產品對某些Img標籤包含相同的值,會不會成爲問題?我不確定在這種情況下是否會有衝突。請指導。提前致謝。

+0

爲什麼是基於'本地名稱的''定義()' ?你不應該那樣做。 – Tomalak

回答

0

使用兩部分的關鍵,是這樣的:

<xsl:key 
    name="keyImg" 
    match="Product/*[starts-with(name(), 'Img')]" 
    use="concat(generate-id(..), '-', .)" 
/> 

<xsl:template match="Product"> 
    <xsl:variable name="productID" select="generate-id()" /> 

    <xsl:for-each select="*[starts-with(name(), 'Img')][ 
    generate-id() = generate-id(key(concat($productID, '-', .))) 
    ]"> 
    <!-- ... ---> 
    </xsl:for-each> 
</xsl:template> 

在一般注意它不是理想的,如果用相同的語義值(Img)節點有不同的名字(Img1,Img2等)。如果你可以做任何事情,只要將它們命名爲Img

0

Q.但是同樣的鑰匙一遍又一遍地被使用。這將是一個問題,如果兩個產品包含一些IMG標記相同的值?我不知道是否會有在這種情況下的衝突。

是否存在「衝突」與否取決於想要的結果。您的密鑰保存所有圖*項目在列表中的值相同。有了這個鍵就可以生成所有圖*值的唯一列表。

如果密鑰在一個產品中對於Img *值應該是唯一的,您可以將generate-id()或「Product/ID」添加到密鑰中。 事情是這樣的:

<xsl:key name="keyImg" match="Product/*[starts-with(local-name(), 'Img')]" 
      use="concat(../ID, '|', .)"/> 

如果圖*每日新聞的名稱是衆所周知的,你也可以試試這個:

<xsl:key name="keyImg" match="Img1 | Img2 | Img2 | Img4" 
      use="concat(../ID, '|', .)"/>