2010-04-30 162 views
1
位置

此得到更加複雜:)XSL唯一值每

現在我面臨的最後一個問題,另一個問題,我們設法從只有一個父節點採取獨特的價值觀

現在:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<roots> 
    <root> 
      <name>first</name> 
      <item> 
       <something>A</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>B</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>C</something> 
       <something>P</something> 
      </item> 
      <item> 
       <something>A</something> 
       <something>L</something> 
      </item> 
      <item> 
       <something>A</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>B</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>D</something> 
       <something>A</something> 
      </item> 
    </root> 
    <root> 
      <name>second</name> 
      <item> 
       <something>E</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>B</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>F</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>A</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>A</something> 
       <something>A</something> 
      </item> 
      <item> 
       <something>B</something> 
       <something>H</something> 
      </item> 
      <item> 
       <something>D</something> 
       <something>G</something> 
      </item> 
    </root> 
</roots> 

現在我需要得到這取決於只能從一個節點之前只是從第二位置的元素特有的價值觀

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output indent="yes" method="text"/> 
    <xsl:key name="item-by-value" match="something" 
use="concat(normalize-space(.), ' ', generate-id(./ancestor::root))"/> 
<xsl:key name="rootkey" match="root" use="name"/> 
    <xsl:template match="/"> 
<xsl:for-each select="key('rootkey','first')"> 
<xsl:for-each select="item/something[1]"> 
<xsl:sort /> 
    <xsl:if test="generate-id() = generate-id(key('item-by-value', 
        concat(normalize-space(.), ' ', generate-id(./ancestor::root))))"> 
    <xsl:value-of select="."/> 
</xsl:if> 
</xsl:for-each> 
<xsl:text>_________</xsl:text> 
<xsl:for-each select="item/something[2]"> 
<xsl:sort /> 
    <xsl:if test="generate-id() = generate-id(key('item-by-value', 
        concat(normalize-space(.), ' ', generate-id(./ancestor::root))))"> 
    <xsl:value-of select="."/> 
</xsl:if> 
</xsl:for-each> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

與這個XSL我得到ABCD_________LP 其中我需要的結果是ABCD_________ALP

任何想法?

+0

(+1)。查看我的答案,以便輕鬆修改我提供給您的上一個問題的解決方案。這很簡單。 :) – 2010-04-30 16:20:33

+0

@Nathan - 你能使用xslt 2.0嗎?如果是這樣,你在用什麼處理器? (我找不到你的其他問題;對不起,如果這是涵蓋在那一個) – 2010-04-30 17:45:40

+0

不,我只能使用xslt 1.0,我使用Xalan – 2010-04-30 18:02:14

回答

1

再次,問題是,如果你想要說的」第一個節點在此根目錄下出現在item節點的此位置「,那麼您必須將」item節點中的位置「添加到密鑰中。您可以通過具有兩個獨立的按鍵做到這一點,因爲Dimitre的解決方案呢,或者改變您的關鍵:

use="concat(normalize-space(.), ' ', 
    count(./preceding-sibling::something), ' ', generate-id(./ancestor::root))"/> 

,然後進行兩個測試表達式如下所示:

<xsl:if test="generate-id() = generate-id(key('item-by-value', 
       concat(normalize-space(.), ' 0 ', generate-id(./ancestor::root))))"> 

和:

<xsl:if test="generate-id() = generate-id(key('item-by-value', 
       concat(normalize-space(.), ' 1 ', generate-id(./ancestor::root))))"> 
+0

合理。我討厭讓鍵「太複雜」,所以我使用了兩個更簡單的鍵。 – 2010-04-30 16:32:03

+0

真棒謝謝! – 2010-04-30 16:38:04

1

只是稍微修改了我對上一個問題的回答,你已經明白了!

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:key name="kSomethingByNameAndVal-1" match="something[1]" 
    use="concat(../../name, '+', .)"/> 

<xsl:key name="kSomethingByNameAndVal-2" match="something[2]" 
    use="concat(../../name, '+', .)"/> 

<xsl:template match="/"> 
    <xsl:for-each select="*/*"> 
    <xsl:for-each select= 
     "item/something[1] 
      [generate-id() 
      = 
       generate-id(key('kSomethingByNameAndVal-1', 
           concat(../../name, '+', .) 
          ) 
         ) 
      ] 
     "> 

     <xsl:value-of select="."/> 
    </xsl:for-each> 
    <xsl:text>&#xA;</xsl:text> 

    <xsl:for-each select= 
     "item/something[2] 
      [generate-id() 
      = 
       generate-id(key('kSomethingByNameAndVal-2', 
           concat(../../name, '+', .) 
          ) 
         ) 
      ] 
     "> 

     <xsl:value-of select="."/> 
    </xsl:for-each> 
    <xsl:text>&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用,有用的,正確的結果都是

ABCD 
APL 
EBFAD 
AHG 
+0

我們必須停止這樣的會議...... – 2010-04-30 16:26:04

+0

@ Daniel-馬丁:?????? – 2010-04-30 16:27:55

+0

哦,這又是一次:來自同一個人關於xsl的問題,同樣的兩個人回答,當我打我的時候,你的答案再次出現,我們每個人給出的答案都非常類似於每個人我們對他早先的問題給了。 – 2010-04-30 16:32:24

0

我知道您僅限於XSLT 1.0,並且您使用的是Xalan,但我會添加此答案以防萬一它可能有助於其他人在未來進行搜索。 (可以使用XSLT 2.0。)希望你不介意。

此外,我正在使用Saxon-HE 9.2.0.6處理器。

這裏的樣式表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text"/> 

    <xsl:template match="/roots"> 
     <xsl:for-each select="root"> 
     <xsl:value-of select="distinct-values(item/something[1])"/>___<xsl:value-of select="distinct-values(item/something[2])"/> 
     <xsl:text>&#xA;</xsl:text> 
     </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

下面是使用XML輸出:

A B C D___A P L 
E B F A D___A H G 

如果你想從輸出條的空間,你可以把輸出的一個變量,然後使用replace去掉空格。 (任何人都知道更好的方法?)

樣式表:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text"/> 

    <xsl:template match="/roots"> 
     <xsl:variable name="output"> 
     <xsl:for-each select="root"> 
      <xsl:value-of select="distinct-values(item/something[1])"/>___<xsl:value-of select="distinct-values(item/something[2])"/> 
      <xsl:text>&#xA;</xsl:text> 
     </xsl:for-each> 
     </xsl:variable> 
     <xsl:value-of select="replace($output,' ','')"/> 
    </xsl:template> 

</xsl:stylesheet> 

輸出:

ABCD___APL 
EBFAD___AHG 
+0

我不介意它很好有參考:) – 2010-04-30 20:12:29