为何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),'
')"/> </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, '
')"/> </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, '
'), '')"/> </xsl:result-document> </xsl:template>
内容的提问来源于stack exchange,提问作者DaveF
相关产品推荐
相关产品推荐

