#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>
Выходные данные могут быть отформатированы по-разному.