如何修复xsltproc生成的</result>闭合标签对齐问题?
XSLT输出缩进问题:
<result>闭合标签未与起始标签对齐 问题现象
使用xsltproc转换XML时,生成的<result>闭合标签缩进异常,无法与起始标签对齐,示例输出如下:
<result> <channel>netgroup_home_hosts</channel> <value>0.006</value> <!--thresholds start--><LimitMaxWarning>1</LimitMaxWarning><LimitMaxError>2</LimitMaxError><!--thresholds end--> <!--range: min="0"--> </result>
预期<result>闭合标签应与起始标签保持相同缩进级别。
问题原因
核心原因是XSLT默认模板的文本节点处理行为:当未显式定义文本节点模板时,默认模板会复制输入XML中的所有文本节点,包括那些用于格式化的空白字符节点。这些多余的空白被保留到输出后,打乱了正常的缩进结构,导致闭合标签位置偏移。
解决方案
1. 过滤空白文本节点
添加匹配文本节点的模板,仅保留非空白的文本内容,过滤掉无用的空白节点:
<xsl:template match="text()"> <xsl:if test="normalize-space(.) != ''"> <xsl:value-of select="."/> </xsl:if> </xsl:template>
2. 全局控制空白节点
使用<xsl:strip-space>剥离所有元素的空白节点,若有需要保留空白的元素,用<xsl:preserve-space>单独指定:
<!-- 剥离所有元素的空白节点 --> <xsl:strip-space elements="*"/> <!-- 保留指定元素内的文本空白(按需调整) --> <xsl:preserve-space elements="channel value"/>
3. 显式覆盖所有节点模板
确保XSLT中对所有需要处理的节点(如根节点、<result>及其子元素)都定义了显式模板,避免触发默认模板自动处理空白文本节点。
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

