如何在单个元素-XSLT 中合并连续的多个元素
How to merged continued multiple elements in single element -XSLT
我在 p
元素中发现了多个不同的元素(例如 span
、italic
)。 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>
您可以使用元素的 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>
输出的格式可能不同。
我在 p
元素中发现了多个不同的元素(例如 span
、italic
)。 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>
您可以使用元素的 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>
输出的格式可能不同。