Как можно сгруппировать TEXT / ELEMENT по элементу xsl: for-each-group в XSLT 2.0 - PullRequest
0 голосов
/ 28 марта 2019

ВХОД XML:

<overline-start id="tie1" specific-use="tie-bar"/>PtCl<sub>2</sub>(P((CH<sub>2</sub>)<sub><italic toggle="yes">n</italic></sub>)<sub>3</sub><overline-end rid="tie1"/>

ОЖИДАЕМЫЙ XML:

<overline id="tie1" specific-use="tie-bar">PtCl<sub>2</sub>(P((CH<sub>2</sub>)<sub><italic toggle="yes">n</italic></sub>)<sub>3</sub></overline>

МОЙ XSLT 2.0 Код:

<xsl:template match="overline-start">
<xsl:for-each-group select="self::overline-start" group-adjacent="self::overline-start[following-sibling::overline-end]">
<xsl:for-each select="current-group()">
<overline>
<xsl:apply-templates select="@*"/>
<xsl:copy-of select="current-group()"/>
</overline>
</xsl:for-each>

1 Ответ

0 голосов
/ 28 марта 2019

Как вы упомянули требование в комментариях, я попробовал его @ Martin Honnen 's:

Предполагая, что ввод:

<?xml version="1.0" encoding="UTF-8"?>
<p>
      <overline-start id="tie1" specific-use="tie-bar"/>PtCl<sub>2</sub>(P((CH<sub>2</sub>)<sub><italic toggle="yes">n</italic></sub>)<sub>3</sub><overline-end rid="tie1"/>
</p>

A Решение 2.0 может быть:

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output omit-xml-declaration="yes" indent="no" />

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

<xsl:template match="p">
    <overline>
        <xsl:for-each-group select="* | text()" group-starting-with="overline-start">
            <xsl:for-each-group select="current-group()" group-ending-with="overline-end">
                <xsl:apply-templates select="@*" />
                <xsl:sequence select="(current-group() except .) [position() != last()]" />
            </xsl:for-each-group>
        </xsl:for-each-group>
    </overline>
</xsl:template>
</xsl:stylesheet>

http://xsltfiddle.liberty -development.net / bnnZW8 / 1

...