I. 去除任意数量连续空格的起始组的非递归 XSLT 1.0 解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p/text()">
<xsl:value-of select=
"substring-after
(.,
substring-before
(.,
substring
(translate(., ' ', ''), 1, 1)
)
)"/>
</xsl:template>
</xsl:stylesheet>
应用于提供的 XML 文档时:
<Text>
<p> Sample Text.</p> <p> Sample Text..</p> <p> Sample Text.</p> <p> Sample Text.</p> <p> Sample Text.</p>
</Text>
产生了想要的正确结果:
<Text>
<p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
说明:
这个想法是:
获取第一个非空格字符。
获取该字符前面的空格字符串(在1.中获得)。
获取紧跟在该空格字符串之后的字符串(在 2. 中获得)。
二、XSLT 2.0 解决方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p/text()">
<xsl:sequence select="replace(., '^\s+(.+)$', '$1')"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于同一个 XML 文档(如上)时,会产生相同的正确结果:
<Text>
<p>Sample Text.</p> <p>Sample Text..</p> <p>Sample Text.</p> <p>Sample Text.</p> <p>Sample Text.</p>
</Text>
请注意:
Martin Honnen 建议使用:
replace(., '^\s+', '')
虽然这比:
replace(., '^\s+(.+)$', '$1')
后者效率更高,因为它只进行一次替换,而前者通常执行许多单独的替换。
更新:OP 无法使用 XSLT 2.0 解决方案,他在评论中写道:
我现在在想,看起来是一个空格的东西实际上可能是一个标签,我将如何检查它然后删除它?
解决方案就是使用:
replace(., '^[\s	 ]+(.+)$', '$1')