加入连续 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>
输入注意事项
span
个元素都是一样的CSSclass.
- 在大多数情况下,除了
span
之外没有其他元素包含在 <p>
标记中。有时 span
的 不是连续的 并且 <br>
或 <p>
可能会出现在示例 #2 中
期望的输出#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>
备注:
- XML 文档中不能有未关闭的
br
标签;
- 我假设
br
需要转换为 space;
- 您没有提供
p
作为兄弟姐妹出现的示例
span
s,我不知道如何处理它。
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>
我正在尝试处理几个自动生成的 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>
输入注意事项
span
个元素都是一样的CSSclass.- 在大多数情况下,除了
span
之外没有其他元素包含在<p>
标记中。有时span
的 不是连续的 并且<br>
或<p>
可能会出现在示例 #2 中
期望的输出#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>
备注:
- XML 文档中不能有未关闭的
br
标签; - 我假设
br
需要转换为 space; - 您没有提供
p
作为兄弟姐妹出现的示例span
s,我不知道如何处理它。
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>