我想在以下位置左右修剪空格:
<xsl:value-of select="Datas/Data[@key='Name']/string"/>
我怎样才能做到这一点?
normalize-space(Datas/Data[@key='Name']/string)
可能就足够了,它将修剪空白以及开始和结束。然而,它也会将中间的任何空白折叠成一个空间,我不知道你是否想要。
最简单的方法是使用FXSLtrim
的模板功能。
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="trim.xsl"/>
<xsl:output method="text"/>
<xsl:template match="/">
'<xsl:call-template name="trim">
<xsl:with-param name="pStr" select="string(/*)"/>
</xsl:call-template>'
</xsl:template>
</xsl:stylesheet>
应用于此 XML 文档时:
<someText>
This is some text
</someText>
产生想要的正确结果:
'This is some text'
trim
工作原理:
消除字符串中的所有起始空白字符很容易,但困难的部分是消除所有结束空白字符。
FXSL 的trim
函数/模板通过使用 FXSL 的另一个模板/函数来反转字符串来实现这一点。
所以,处理是这样的:
消除前导空白。
反转结果。
消除前导空格。
最后反转。
trim()
FXSL 2.0(对于 XSLT 2.0)的完整代码可以在 这里看到。trim
它与 FXSL 1.0(针对 XSLT 1.0)的模板代码几乎相同。
提供我在 XSLT 2.0 中使用的另一种解决方案,因为它更简洁准确(规范化空间不是修剪)。
使用 replace 函数和正则表达式来获取内部内容减去前后空格。
replace(Datas/Data[@key='Name']/string,'^\s*(.+?)\s*$', '$1')
比较用于 XSLT2 用户的@ricosrealm 解决方案与用于 XSLT1 的@Dimitre 解决方案(并检查 FXSL-trim 的行数)。正则表达式替换功能如此简单,花费更少的 CPU 时间和程序员的时间。
如果您是 XSLT1 用户,可能是因为您没有选择使用 XSLT2。示例:PHP 依赖于 LibXML2 实现,它在 1999 年的标准中停止,而不是实现 2007 年的标准。今天(2013 年)只有一小部分 XSLT1 用户出于性能考虑这样做。
所以,如果你假设你被 XSLT1 和你的框架困住了,是时候了解和使用“注册函数”了,就像在 PHP 上一样(但任何其他像 Python 或 Javascript 使用 LibXML2 都可以使用LibXML2 的扩展),以接近 XSLT2自由/功能。
请参阅您的语言的 XSLTProcessor::registerPHPFunctions。
PHP 示例:
<xsl:value-of
select="php:functionString( 'trim', Datas/Data[@key='Name']/string )"
/>
注意(已编辑):对于非 libXML2 实现,如在 Microsoft (.NET) 框架中,如 @ChristopheDebove 所示(以下评论),也有注册函数的解决方案。当然,对于 Java 来说,还有 SAXON,它是当今 XSLT2 唯一好的开源软件。
...如果有一天(请参阅有关何时在此处和此处查看的意见)您在同一框架(例如 PHP)中将 XSLT1 替换为 XSLT2,则无需更改 XSLT 脚本,因为预计注册的函数将是相同的。
您可以只使用 XSLT 1.0 制作自己的:
如果只trim
需要 a ,您可以像下面的模板一样自己实现它。它以递归方式调用自身并去除字符,直到内置 XSLT 函数normalize-space()
的第一个和最后一个字符与剩余字符串的第一个和最后一个字符匹配。这两种情况基本上是left-trim和right-trim,先做left-trim(otherwise
外壳)。
在大型数据集上可能会有点慢,但效果很好:
<xsl:template name="Trim">
<xsl:param name="value"/>
<xsl:choose>
<xsl:when test="string-length($value)=0 or string-length(normalize-space($value))=0">
<xsl:value-of select="$value"/>
</xsl:when>
<xsl:when test="starts-with($value,substring(normalize-space($value),1,1))">
<xsl:choose>
<xsl:when test="starts-with(substring($value,string-length($value)-1,1),substring(normalize-space($value),string-length(normalize-space($value))-1,1))">
<xsl:value-of select="$value"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="Trim">
<xsl:with-param name="value" select="substring($value,1,string-length($value)-1)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="Trim">
<xsl:with-param name="value" select="substring($value,2)"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
用法:
<xsl:call-template name="Trim"><xsl:with-param name="value" select="mynodehere"/></xsl:call-template>