You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何XPath输出字符串前添加空格?Saxon解析器遇此疑难

问题解析:XSLT输出多余前导空格的原因与解决办法

问题场景

使用最新版Saxon解析器处理OSM XML片段时,生成的文本文件除首行外,其余行开头莫名出现多余空格。即使移除换行符,输出内容的每个元素前仍带有空格。尝试设置<xsl:output indent="no"/>和normalize-space()均无法解决问题。

原始XML片段

<osm>
    <node id="38275590">
        <tag k="name" v="Wimbledon"/>
    </node>
    <node id="28377390">
        <tag k="name" v="Westminster"/>
    </node>
    <node id="168325631">
        <tag k="name" v="Brixton"/>
    </node>
</osm>

所用XSLT代码

<xsl:template match="osm">  
    <xsl:result-document href="{'Underground_Now.txt'}">
        <xsl:value-of select="node[tag[@k='railway'][@v='station']]/tag[@k='name']/concat(string(@v),'&#xa;')"/>
    </xsl:result-document>
</xsl:template> 

异常输出(圆点标识空格)

Wimbledon
•Westminster
•Brixton

原因分析

核心问题出在<xsl:value-of>的默认行为:当它处理节点序列时,会自动在序列中每个节点的返回值之间添加单个空格作为分隔符。

你的XPath表达式返回的是多个concat()执行后的字符串序列(每个<node>对应一个拼接了换行符的名称字符串),<xsl:value-of>在拼接这些字符串时,自动插入了空格,导致后续每行开头多出一个空格。

解决方案

方案1:使用<xsl:for-each>遍历输出

通过逐个遍历目标节点并输出内容,绕开<xsl:value-of>的默认分隔行为:

<xsl:template match="osm">  
    <xsl:result-document href="Underground_Now.txt">
        <xsl:for-each select="node[tag[@k='railway'][@v='station']]/tag[@k='name']">
            <xsl:value-of select="concat(@v, '&#xa;')"/>
        </xsl:for-each>
    </xsl:result-document>
</xsl:template>

方案2:使用string-join()指定空分隔符

通过string-join()函数显式设置序列元素的分隔符为空字符串,覆盖默认的空格:

<xsl:template match="osm">  
    <xsl:result-document href="Underground_Now.txt">
        <xsl:value-of select="string-join(node[tag[@k='railway'][@v='station']]/tag[@k='name']/concat(@v, '&#xa;'), '')"/>
    </xsl:result-document>
</xsl:template>

内容的提问来源于stack exchange,提问作者DaveF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:12:44