【问题标题】:xsl:for-each-group does not give me group boundaries included in the groupsxsl:for-each-group 不给我包含在组中的组边界
【发布时间】:2020-10-18 11:53:04
【问题描述】:

我正在将数学公式从一种专有格式转换为另一种格式。主要问题是原始格式按元素出现的顺序列出元素,其中目标格式使用严格内容 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 的 TYPE 与第一个不同时,它会改变:

<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

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

【问题讨论】:

    标签: xslt xslt-2.0 xslt-grouping


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 2012-07-01
      相关资源
      最近更新 更多