我知道,关于 group-adjacent 功能的问题已经被问过了。但由于某种原因,我无法让它工作。
我在工作中继承了使用 xslt 的项目,而我的老板不明白学习 xslt 的学习曲线有多陡峭,以及它与过程编程有多么不同。
尽管如此,我还是决心尽可能地学习它,但我仍然必须在学习的同时使用它。解决以下问题的任何帮助将不胜感激。
我有一个格式如下的 xml 文档:
<document xml:lang="EN">
<CRPg>text</CRPg>
<CRPg>text</CRPg>
<CRPg>text</CRPg>
<Section/> <!--section marker-->
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
<Section/> <!--section marker-->
<Txt>body text</Txt>
<Txt>body text</Txt>
<Txt>body text</Txt>
<Txt>body text</Txt>
</document>
目前它基本上没有层次结构,并且包含标记以赋予它结构并包含在整个文件中。我正在尝试将所有 TOC 元素分组并将它们嵌套在包含元素中:
<document xml:lang="EN">
<CRPg>text</CRPg>
<CRPg>text</CRPg>
<CRPg>text</CRPg>
<Section/> <!--section marker-->
<Wrapper> <!-- create new element to wrap around TOC and TOCAuth -->
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
<TOCChap>chapter title</TOCChap>
<TOCAu>chapter author</TOCAu>
</Wrapper>
<Section/> <!--section marker-->
<Txt>body text</Txt>
<Txt>body text</Txt>
<Txt>body text</Txt>
<Txt>body text</Txt>
</document>
事实证明,这比我预期的要困难。我已经尝试了以下代码的许多不同版本,并且我粘贴了似乎最不出错的版本。我意识到它仍然很糟糕:
<xsl:template match="*">
<xsl:for-each-group select="TOCChap | TOCAuth" group-adjacent="self::TOCChap | self::TOCAuth">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<wrapper>
<xsl:apply-templates select="current-group()"/>
</wrapper>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
先感谢您。