我在尝试使用 XSLT 处理一大块 HTML 时遇到了一些奇怪的行为。我正在尝试用图形元素替换 img 元素。该元素被替换,但周围的包装元素随后出现两次,一次在图形元素之前,一次在之后。下面的例子说明了这个问题。Saxon 9.0.0.8 和 9.1.0.8(我们的 CMS 的两个不同版本)中都存在问题
我正在处理的 HTML 如下:
<p class="editor-p-block">
<img alt="Untitled-2" src="image://11?_size=full" title="Untitled-2" />
</p>
模板如下:
<xsl:template name="stk:html.process">
<xsl:param name="document" as="element()"/>
<xsl:apply-templates select="$document/*|$document/text()" mode="html.process"/>
</xsl:template>
<xsl:template match="element()" mode="html.process">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="*|text()|@*" mode="html.process"/>
</xsl:element>
</xsl:template>
<xsl:template match="img" mode="html.process">
<xsl:element name="figure"/>
</xsl:template>
<xsl:template match="text()|@*" mode="html.process">
<xsl:copy/>
</xsl:template>
这会产生以下 HTML:
<p class="editor-p-block">
</p>
<figure></figure>
<p></p>
我在这里做错了什么?
编辑:完全可重现的例子:
<xsl:output method="xhtml"/>
<xsl:template match="/">
<xsl:variable name="document" as="element()">
<content xmlns="">
<p class="editor-p-block">
<img alt="Untitled-2" src="image://11?_size=full" title="Untitled-2"/>
</p>
</content>
</xsl:variable>
<xsl:call-template name="stk:html.process">
<xsl:with-param name="document" select="$document"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="stk:html.process">
<xsl:param name="document" as="element()"/>
<div class="editor">
<xsl:apply-templates select="$document/*|$document/text()" mode="html.process"/>
</div>
</xsl:template>
<xsl:template match="element()" mode="html.process">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="*|text()|@*" mode="html.process"/>
</xsl:element>
</xsl:template>
<xsl:template match="img" mode="html.process">
<xsl:element name="figure"/>
</xsl:template>
<xsl:template match="text()|@*" mode="html.process">
<xsl:copy/>
</xsl:template>