Как объединить продолжение нескольких элементов в одном элементе -XSLT

#xslt #xslt-2.0

#xslt #xslt-2.0

Вопрос:

Я нашел продолжение нескольких разных элементов (например, span , italic ) в p элементе. span продолжение элементов, объединенных в один элемент, но как обрабатывать продолжение нескольких italic элементов.
Ввод XML

 <root>
    <p>Paragraph <span>a</span><span>b</span><span>c</span><span>d</span> Under Continuing <span>Court</span> Jurisdiction <italic>a</italic><italic>b</italic><italic>c</italic></p>
    <p>Paragraph <italic>a</italic><italic>b</italic><italic>c</italic><italic>d</italic> Under Continuing Court <span>Jurisdiction</span></p>
</root>
  

Код XSLT

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

<xsl:template match="p">
    <xsl:copy>
        <xsl:for-each-group select="node()" group-adjacent=". instance of element(span), element(italic)">
            <xsl:choose>
                <xsl:when test="current-grouping-key()[1]">
                    <span>
                        <xsl:apply-templates select="current-group()/node()"/>
                    </span>
                </xsl:when>
                <xsl:when test="current-grouping-key()[2]">
                    <italic>
                        <xsl:apply-templates select="current-group()/node()"/>
                    </italic>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="current-group()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>
  

Ожидаемый результат

 <root>
    <p>Paragraph <span>abcd</span> Under Continuing <span>Court</span> Jurisdiction <italic>abc</italic></p>
    <p>Paragraph <italic>abcd</italic> Under Continuing Court <span>Jurisdiction</span></p>
</root>
  

Комментарии:

1. Как бы вы хотели справиться <span>a</span><span>b</span><italic>c</italic><italic>d</italic><span>e</span> ?

Ответ №1:

Вы можете изменить свой второй шаблон, используя local-name() элементы, подобные этому:

 <xsl:template match="p">
    <xsl:copy>
        <xsl:for-each-group select="node()" group-adjacent="local-name()='span' or local-name()='italic'">
            <xsl:choose>
                <xsl:when test="current-grouping-key()">
                    <xsl:copy>
                        <xsl:apply-templates select="current-group()/node()"/>
                    </xsl:copy>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="current-group()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>
  

Результат таков

 <root>
    <p>
        Paragraph <span>abcd</span>
        Under Continuing <span>Court</span>
        Jurisdiction <italic>abc</italic>
    </p>
    <p>
        Paragraph <italic>abcd</italic>
        Under Continuing Court <span>Jurisdiction</span>
    </p>
</root>
  

Выходные данные могут быть отформатированы по-разному.