XSLT 1不同的分组

时间:2017-04-07 08:06:58

标签: xml xslt xpath

我正在尝试在分组后做一个明显的并且它不起作用。 使用此节点:

<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 个答案:

答案 0 :(得分: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" />

然后,要获得不同的VALUE节点,请执行此操作

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

对于您希望为特定类型获取不同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" />