xsl:for-每个组不给我组中包含的组边界

xsl:for-each-group does not give me group boundaries included in the groups

我正在将数学公式从一种专有格式转换为另一种格式。主要问题是原始格式按照元素出现的顺序列出元素,其中目标格式使用符合 Strict Content MathML 的逻辑定义(但完全不一样 - 甚至 XML 在这个例)。

公式如下:

<FORMULA>
  <EXPR>A</EXPR>
  <OP.CMP TYPE="EQ"/>
  <EXPR>B</EXPR>
  <OP.CMP TYPE="EQ"/>
  <EXPR>C</EXPR>
</FORMULA>

会变成:

equal[char[A],char[B],char[C]]

这很简单,但是当第二个 OP.CMP 的类型与第一个不同时,它会发生变化:

<FORMULA>
  <EXPR>A</EXPR>
  <OP.CMP TYPE="EQ"/>
  <EXPR>B</EXPR>
  <OP.CMP TYPE="NE"/>
  <EXPR>C</EXPR>
</FORMULA>

变为:

equal[char[A],notequal[char[B],char[C]]]

由于每个层级中有许多嵌套层级,我需要首先使用运算符 OP.CMP 和 OP.MATH 作为组边界对元素进行分组来处理公式。然后我会选择 OP.CMP 或 OP.MATH 的类型来启动组。但是,当我使用以 OP.CMP 或 OP.MATH 结尾的 xml:for-each-group 时,我没有找到该组中包含的 OP.CMP 或 OP.MATH,这我会预料到的。这是我的简单测试 XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:template match="FORMULA" mode="eqn">
    <xsl:for-each-group select="node()" group-ending-with="OP.CMP">
        <xsl:message>Group <GRP><xsl:copy-of select="."/></GRP></xsl:message>
    </xsl:for-each-group>
</xsl:template>

我得到的是:

A

B

C

我期待的地方:

A

B

C

结束该组的元素是否未包含在该组中?如果是这样,我应该用别的东西代替吗?

for-each-group 内部,上下文项 . 是每个组中的第一个项目,而不是整个组;您可以使用 current-group() 访问的完整组,在 group-ending-with 的情况下,项目 current-group()[last()] 将是匹配的项目(或最后剩下的项目)。