如何用XSLT生成类似span的内联自定义g标签?
解决XSLT生成自定义
<g>元素时多余空格的问题 问题原因
你遇到的情况是因为Saxon的HTML输出模式会依据标准HTML元素的默认表现来格式化输出:<span>是W3C规范定义的内联元素,处理器会紧凑输出它;而<g>是自定义元素,处理器默认将其识别为块级元素,因此自动添加了换行和缩进空格,这些空格会在网页中被渲染为空白。
解决方案
这里提供三种可行的解决方式,你可以根据需求选择:
1. 利用Saxon扩展属性标记<g>为内联元素
Saxon支持扩展属性saxon:inline,可以直接指定自定义元素按内联方式输出,无需修改整体输出规则:
- 首先在样式表中声明Saxon命名空间:
xmlns:saxon="http://saxon.sf.net/" - 在生成
<g>元素时添加saxon:inline="yes"属性
修改后的XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:n="http://www.tei-c.org/ns/1.0" xmlns:saxon="http://saxon.sf.net/" exclude-result-prefixes="n saxon" > <xsl:output encoding="UTF-8" method="html"/> <xsl:template match="/n:TEI/n:text/n:body"> <html> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="n:g"> <xsl:element name="g" saxon:inline="yes"> <xsl:attribute name="type"> <xsl:text>gaiji</xsl:text> </xsl:attribute> <xsl:apply-templates/> </xsl:element> <xsl:element name="span"> <xsl:attribute name="class"> <xsl:text>gaiji</xsl:text> </xsl:attribute> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="text()"> <xsl:value-of select="normalize-space(.)"/> </xsl:template> </xsl:stylesheet>
2. 切换为XHTML输出方法
将输出方法从html改为xhtml,XHTML作为XML格式,会统一处理所有元素的缩进,不会区分块级和内联:
<xsl:output encoding="UTF-8" method="xhtml" indent="yes"/>
如果不需要任何缩进,可以进一步添加indent="no",这样输出会完全紧凑,不会有多余空格。
3. 关闭输出缩进
直接在<xsl:output>中关闭缩进功能,所有元素都会紧凑输出,彻底避免多余空格:
<xsl:output encoding="UTF-8" method="html" indent="no"/>
验证效果
使用上述任意方法后,重新转换XML,输出的<g>元素会和<span>一样紧凑,不会出现多余的换行和缩进:
<html> <body>some text<g type="gaiji">char</g><span class="gaiji">char</span>some text </body> </html>
内容的提问来源于stack exchange,提问作者callmenp
相关产品推荐
相关产品推荐

