我使用xdmp:xslt-invoke()在Marklogic中转换文档。这很好,但是今天我在使用<xsl:for-each-group select="..." group-starting-with="...">时遇到了一个问题(虽然group-adjacent的使用和我的XSLT的其他部分一样)
XML输入
<DOC>
<AL>
<TABLEAU FILET="1" FRAME="ALL" ID="L90F6543EAA5E12-EFL">
<TGROUP COLS="2">
<COLSPEC COLNAME="COL1" COLNUM="1"/>
<COLSPEC COLNAME="COL2" COLNUM="2"/>
<TBODY>
<ROW>
<ENTRY ALIGN="CENTER" COLNAME="COL1" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL>
<MOTREP>Éléments à inclure dans l'assiette</MOTREP>
</AL>
</ENTRY>
<ENTRY ALIGN="CENTER" COLNAME="COL2" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL>
<MOTREP>Éléments exclus de l'assiette</MOTREP>
</AL>
</ENTRY>
</ROW>
</TBODY>
</TGROUP>
</TABLEAU>
</AL>
</DOC>XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="2.0">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="AL">
<xsl:variable name="self" as="element()" select="."/>
<xsl:for-each-group select="node()" group-starting-with="LST | TABLEAU">
<xsl:choose>
<xsl:when test="local-name(current-group()[1]) = ('LST', 'TABLEAU')">
<xsl:apply-templates select="current-group()" mode="#current"/>
</xsl:when>
<xsl:otherwise>
<AL>
<xsl:apply-templates select="current-group()" mode="#current"/>
</AL>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>Saxon的XML输出9.8.0.12
<DOC>
<AL>
</AL><TABLEAU FILET="1" FRAME="ALL" ID="L90F6543EAA5E12-EFL">
<TGROUP COLS="2">
<COLSPEC COLNAME="COL1" COLNUM="1"/>
<COLSPEC COLNAME="COL2" COLNUM="2"/>
<TBODY>
<ROW>
<ENTRY ALIGN="CENTER" COLNAME="COL1" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL>
<MOTREP>Éléments à inclure dans l'assiette</MOTREP>
</AL>
</ENTRY>
<ENTRY ALIGN="CENTER" COLNAME="COL2" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL>
<MOTREP>Éléments exclus de l'assiette</MOTREP>
</AL>
</ENTRY>
</ROW>
</TBODY>
</TGROUP>
</TABLEAU>
</DOC>用MarkLogic10.0-3 XSLT处理器输出
<DOC>
<TABLEAU FRAME="ALL" ID="L90F6543EAA5E12-EFL">
<TGROUP COLS="2">
<TBODY>
<ROW>
<ENTRY ALIGN="CENTER" COLNAME="COL1" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<TABLEAU FRAME="ALL" ID="L90F6543EAA5E12-EFL">
<TGROUP COLS="2">
<TBODY>
<ROW>
<ENTRY ALIGN="CENTER" COLNAME="COL1" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<MOTREP>Éléments à inclure dans l'assiette test1</MOTREP>
</AL>
</ENTRY>
<ENTRY ALIGN="CENTER" COLNAME="COL2" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<MOTREP>Éléments exclus de l'assiette</MOTREP>
</AL>
</ENTRY>
</ROW>
</TBODY>
</TGROUP>
</TABLEAU>
</ENTRY>
<ENTRY ALIGN="CENTER" COLNAME="COL2" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<TABLEAU FRAME="ALL" ID="L90F6543EAA5E12-EFL">
<TGROUP COLS="2">
<TBODY>
<ROW>
<ENTRY ALIGN="CENTER" COLNAME="COL1" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<MOTREP>Éléments à inclure dans l'assiette test1</MOTREP>
</AL>
</ENTRY>
<ENTRY ALIGN="CENTER" COLNAME="COL2" COLSEP="1" ROWSEP="1" VALIGN="TOP">
<AL xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<MOTREP>Éléments exclus de l'assiette</MOTREP>
</AL>
</ENTRY>
</ROW>
</TBODY>
</TGROUP>
</TABLEAU>
</ENTRY>
</ROW>
</TBODY>
</TGROUP>
</TABLEAU>
</DOC>在Marklogic输出中获得嵌套的TABLEAU元素是非常奇怪的,因为它复制了条目内容。
看起来像是虫子还是我漏掉了什么?
发布于 2022-01-04 18:30:56
当您在<xsl:apply-templates select="current-group()">中使用xsl:for-each-group时,似乎有些东西在流血,上下文变得一团糟。
这似乎是一个错误,在使用xsl:apply-templates到current-group()时,会将意外的内容传递到输出中。
如果您在xsl:copy-of中更改为xsl:when
<xsl:when test="local-name(current-group()[1]) = ('LST', 'TABLEAU')">
<xsl:copy-of select="current-group()" />
</xsl:when>那么它就不会产生额外的TABLEAU元素和子元素。
https://stackoverflow.com/questions/70582508
复制相似问题