2013-03-11 58 views
0

我有一個如下所示的xml。我需要找到所有不同的貨幣。使用以下內容來自祖父母級別的XSLT同胞

<xsl:for-each select="$itemPrices/Relationships/Relationship/Target 
         /Properties/PropertyItem[cs:Key='Currency']/cs:Value"> 

我已經能夠獲得所有貨幣類型,但有重複。我需要使用XSLT 1.0找到不同的值。我遇到了使用之前和之後的兄弟姐妹的解決方案,但我能夠在同一級別獲得兄​​弟姐妹。我無法構建一個XPath,將四個級別中的三個升級,然後查看可比較的下一個兄弟。

<Relationship> 
    <ModelName>Entities.Relationship</ModelName> 
    <Properties /> 
    <Target> 
     <ModelName>ItemPrice</ModelName> 
     <Properties> 
     <PropertyItem> 
      <Key>Currency</Key> 
      <Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">US</Value> 
     </PropertyItem> 
     <PropertyItem> 
      <Key>PriceValue</Key> 
      <Value i:type="a:decimal" xmlns:a="http://www.w3.org/2001/XMLSchema">13.51</Value> 
     </PropertyItem> 
     <PropertyItem> 
      <Key>ProductId</Key> 
      <Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">0600</Value> 
     </PropertyItem> 
     </Properties> 
    </Target> 
    </Relationship> 
    <Relationship> 
    <ModelName>Entities.Relationship</ModelName> 
    <Properties /> 
    <Target> 
     <ModelName>ItemPrice</ModelName> 
     <Properties> 
     <PropertyItem> 
      <Key>Currency</Key> 
      <Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">US</Value> 
     </PropertyItem> 
     <PropertyItem> 
      <Key>PriceValue</Key> 
      <Value i:type="a:decimal" xmlns:a="http://www.w3.org/2001/XMLSchema">11.82</Value> 
     </PropertyItem> 
     <PropertyItem> 
      <Key>ProductId</Key> 
      <Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">0600</Value> 
     </PropertyItem> 
     </Properties> 
    </Target> 
    </Relationship> 
    <Relationship> 
    <ModelName>Entities.Relationship</ModelName> 
    <Properties /> 
    <Target> 
     <ModelName>ItemPrice</ModelName> 
     <Properties> 
     <PropertyItem> 
      <Key>Currency</Key> 
      <Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">Canadian</Value> 
     </PropertyItem> 
     <PropertyItem> 
      <Key>PriceValue</Key> 
      <Value i:type="a:decimal" xmlns:a="http://www.w3.org/2001/XMLSchema">10.95</Value> 
     </PropertyItem> 
     <PropertyItem> 
      <Key>ProductId</Key> 
      <Value i:type="a:string" xmlns:a="http://www.w3.org/2001/XMLSchema">0600</Value> 
     </PropertyItem> 
     </Properties> 
    </Target> 
    </Relationship> 

所以在上面的XML中,我應該只給美國和加拿大一次,而不是美國兩次和加拿大一次。我怎樣才能做到這一點?

回答

2

雖然你可以使用preceding::代替preceding-sibling::,高效的方式在XSLT 1.0來選擇不同的值是使用Muenchian分組的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:key name="kCurrency" match="PropertyItem[Key = 'Currency']/Value" 
      use="."/> 

    <xsl:template match="/"> 
    <xsl:variable name="allCurrencies" 
        select="Relationships/Relationship/Target/Properties 
          /PropertyItem[Key = 'Currency']/Value" /> 
    <xsl:for-each select="$allCurrencies[generate-id() = 
        generate-id(key('kCurrency', .)[1])]"> 
     <currency> 
     <xsl:value-of select="."/> 
     </currency> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

<Relationships>元素纏繞在你的示例XML,並送入該XSLT,結果是:

<currency>US</currency> 
<currency>Canadian</currency>