2017-04-07 64 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" />