首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有分组的Marklogic XSLT2.0错误(开始)

带有分组的Marklogic XSLT2.0错误(开始)
EN

Stack Overflow用户
提问于 2022-01-04 17:05:28
回答 1查看 72关注 0票数 2

我使用xdmp:xslt-invoke()在Marklogic中转换文档。这很好,但是今天我在使用<xsl:for-each-group select="..." group-starting-with="...">时遇到了一个问题(虽然group-adjacent的使用和我的XSLT的其他部分一样)

XML输入

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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

代码语言:javascript
复制
<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处理器输出

代码语言:javascript
复制
<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元素是非常奇怪的,因为它复制了条目内容。

看起来像是虫子还是我漏掉了什么?

EN

回答 1

Stack Overflow用户

发布于 2022-01-04 18:30:56

当您在<xsl:apply-templates select="current-group()">中使用xsl:for-each-group时,似乎有些东西在流血,上下文变得一团糟。

这似乎是一个错误,在使用xsl:apply-templatescurrent-group()时,会将意外的内容传递到输出中。

如果您在xsl:copy-of中更改为xsl:when

代码语言:javascript
复制
<xsl:when test="local-name(current-group()[1]) = ('LST', 'TABLEAU')">
  <xsl:copy-of select="current-group()" />
</xsl:when>

那么它就不会产生额外的TABLEAU元素和子元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70582508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档