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()]
将是匹配的项目(或最后剩下的项目)。
我正在将数学公式从一种专有格式转换为另一种格式。主要问题是原始格式按照元素出现的顺序列出元素,其中目标格式使用符合 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>
我得到的是:
我期待的地方:
组
组
结束该组的元素是否未包含在该组中?如果是这样,我应该用别的东西代替吗?
在 for-each-group
内部,上下文项 .
是每个组中的第一个项目,而不是整个组;您可以使用 current-group()
访问的完整组,在 group-ending-with
的情况下,项目 current-group()[last()]
将是匹配的项目(或最后剩下的项目)。