我对XSLT还是很陌生,想知道如何替换某些元素。基本上,我想用普通的 BR 替换带有额外属性的 BR 元素。 XML如下:
<outer_element>
<p>
<font face="Arial">
Invitations<br>
</font>
<font face="Arial">
Charts<br>
</font>
</p>
<span style="font-size:12pt;">
<br clear="all" style="font-size:18pt;">
</span>
<outer_element>
以下是XSL的一部分:
<xsl:template match="//outer_element">
<xsl:element name="outer_element">
<xsl:value-of select="."/>
</xsl:element>
<xsl:element name = "text">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
此外,我不确定我正在寻找的是XSLT 1.0还是XSLT 2.0解决方案。
答案 0 :(得分:1)
您可以使用以下简单模板:
<xsl:template match="br">
<br/>
</xsl:template>
完整的模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="br">
<br/>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
您输入的内容不是有效的XML / XHTML。 br
应该关闭:<br/>
。同样,最后的结束标签也不是结束标签。
如果您不希望使用有效的XHTML,请查看https://jsoup.org/或http://www.html-tidy.org/。
这不成问题:有一个名为identity transform的XSLT模式,该模式将输入递归地复制到输出中,但是允许您覆盖所需每个元素的复制过程。
基本模式锁定是这样的。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
现在为br
添加一个模板,该模板仅复制元素,而不复制属性:
<xsl:template match="br">
<xsl:copy/>
</xsl:template>
应该的。