xml - XSLT 1不同分组

标签 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的所有值来分组。

为何在分组后不区分形式不起作用?

最佳答案

您还需要在以下节点的检查中包括对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" />

关于xml - XSLT 1不同分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43272911/

相关文章:

java - 如何在不出现 DOMException 的情况下将节点复制到不同的文档?

c# - 向 XML 中的组合框添加动态值?

xslt - 使用 xslt 查找唯一节点

xml - Tokenize() 中的 XSL XPATH if 语句

javascript - Wicked-Good-XPath 评估 xPathResult 包含 [异常 : TypeError]

c# - 使用 ASP.net 和 VB.net(或 C#)编辑和删除 XML 文件中的数据

python - 挑出 xml 文档中的标签?

xml - 使用 XSL 合并 XML 文件会删除匹配的元素

xml - XSLT 如果属性存在/否则

powershell - 为什么这个 XPath 可以在 PowerShell 中工作,但不能在任务计划程序中工作?