2017-04-07 66 views
2

我試圖做一個獨特的分組後,它不起作用。 使用這個節點:XSLT 1獨特的分組

<MAIN> 
    <VALUE>A</VALUE> 
    <VALUE>B</VALUE> 
    <VALUE>AB</VALUE> 
    <VALUE>A</VALUE> 
    <VALUE>AB</VALUE> 
</MAIN> 

我可以使用以下XPath:

MAIN/VALUE[not(following::VALUE/text() = text())] 

,我有我的不同的值B,AB,A。但是,如果我有以下節點:

<MAIN> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>A</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>BA</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>B</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>1</TYP> 
     <VALUE>A</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>2</TYP> 
     <VALUE>A</VALUE> 
    </BLOC> 
    <BLOC> 
     <TYP>2</TYP> 
     <VALUE>C</VALUE> 
    </BLOC> 
</MAIN> 

我正在嘗試按TYP進行分組,然後再做清晰處理:

MAIN/BLOC[TYP=1]/VALUE[not(following::VALUE/text() = text())] 

它不工作,我有BA和B,但沒有A.

,如果我嘗試:

MAIN/BLOC[TYP=1]/VALUE 

組由回我的TYP的所有值。

爲什麼在分組後分類不起作用?

回答

1

您還需要在下面的節點上檢查TYP=1。目前,第二個「A」沒有被拾起,因爲它確實有以下節點也是「A」

MAIN/BLOC[TYP=1]/VALUE[not(following::BLOC[TYP=1]/VALUE/text() = text())] 

我注意到,您所標記這個XSLT,並在標題中提到XSLT。在這種情況下,您應該使用名爲Muenchian Grouping的技術來獲取不同的項目。

首先,定義一個像這樣

<xsl:key name="blocs_by_value" match="BLOC" use="VALUE" /> 

鍵,則獲得不同價值的節點,這樣做

<xsl:value-of select="MAIN/BLOC[generate-id() = generate-id(key('blocs_by_value', VALUE)[1])]/VALUE" /> 

對於你想獲得不同價值的節點特定的情況下類型,像這樣定義鍵

<xsl:key name="blocs_by_typ_value" match="BLOC" use="concat(TYP, '|', VALUE)" /> 

然後,獲取不同值的表達式就是這樣。 ..

<xsl:value-of select="MAIN/BLOC[TYP=1][generate-id() = generate-id(key('blocs_by_typ_value', concat(TYP, '|', VALUE))[1])]/VALUE" />