加入连续 HTML 个同类标签,相同 CSS class

Join consecutive HTML tags of the same kind, same CSS class

我正在尝试处理几个自动生成的 HTML 文件,我处于需要加入同一 class 的连续 span 个元素的情况。 class 或多或少是先验的。

编辑#1:

示例输入 #1:

<p class='sC8420256'>
  <span class="s32A37344">OPINION EN PARTIE DISSIDENTE COMMUNE AUX JUGES VU</span>
  <span class="s32A37344">Č</span>
  <span class="s32A37344">INI</span>
  <span class="s32A37344">Č</span>
  <span class="s32A37344">, PINTO DE ALBUQUERQUE ET K</span>
  <span class="s32A37344">Ū</span>
  <span class="s32A37344">RIS</span>
</p>

示例输入 #2:

<p class="sC8420256">
  <span class="s32A37344">OPINION CONCORDANTE DE M. LE JUGE COSTA, À</span>
  <br>
  <span class="s32A37344">LAQUELLE SE RALLIE M. LE JUGE SPIELMANN</span>
</p>

输入注意事项

期望的输出#1:

<p class='sC8420256'>
  <span class="s32A37344">
    OPINION EN PARTIE DISSIDENTE COMMUNE AUX JUGES VUČINIČ, PINTO DE ALBUQUERQUE ET KŪRIS
  </span>
</p>

期望的输出#2:

<p class="sC8420256">
  <span class="s32A37344">OPINION CONCORDANTE DE M. LE JUGE COSTA, À LAQUELLE SE RALLIE M. LE JUGE SPIELMANN</span>
</p>

我可以用 python 和 BeautifulSoup 来解决这个问题,但是有没有一种快速而肮脏的方法可以用 XSLT 做同样的事情?当涉及到 XSL 时,我完全无能为力...

以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="p">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <span class="{span[1]/@class}">
            <xsl:apply-templates/>
        </span>
    </xsl:copy>
</xsl:template>

<xsl:template match="br">
    <xsl:text> </xsl:text>
</xsl:template>

</xsl:stylesheet>

当应用于您的第一个示例时,将 return:

<?xml version="1.0" encoding="UTF-8"?>
<p class="sC8420256">
  <span class="s32A37344">OPINION EN PARTIE DISSIDENTE COMMUNE AUX JUGES VUČINIČ, PINTO DE ALBUQUERQUE ET KŪRIS</span>
</p>

应用于第二个示例(关闭 <br> 元素后!),结果将是:

<?xml version="1.0" encoding="UTF-8"?>
<p class="sC8420256">
  <span class="s32A37344">OPINION CONCORDANTE DE M. LE JUGE COSTA, À LAQUELLE SE RALLIE M. LE JUGE SPIELMANN</span>
</p>

备注:

  1. XML 文档中不能有未关闭的 br 标签;
  2. 我假设 br 需要转换为 space;
  3. 您没有提供 p 作为兄弟姐妹出现的示例 spans,我不知道如何处理它。

how to write the stylesheet so that the transform retains the rest of the HTML body?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="p">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <span class="{span[1]/@class}">
            <xsl:apply-templates/>
        </span>
    </xsl:copy>
</xsl:template>

<xsl:template match="span">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="br">
    <xsl:text> </xsl:text>
</xsl:template>

</xsl:stylesheet>