XSLT 2.0:Tokenize不适用于句点字符(句号/点)

Cra*_*one 2 xslt tokenize

当对句点字符''进行标记时,XSLT的tokenize函数无法正常工作.

-

下面是我对逗号字符进行标记时会发生什么的示例:

XML文件:

<value>a,b,c</value>
Run Code Online (Sandbox Code Playgroud)

XSLT文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:template match="/">
      <firsttoken><xsl:value-of select="tokenize(/value,',')[1]" /></firsttoken>
   </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

输出:

<firsttoken>a</firsttoken>
Run Code Online (Sandbox Code Playgroud)

-

这是相同的示例,但在句点字符上进行标记:

XML文件:

<value>a.b.c</value>
Run Code Online (Sandbox Code Playgroud)

XSLT文件:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:template match="/">
      <firsttoken><xsl:value-of select="tokenize(/value,'.')[1]" /></firsttoken>
   </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

输出:

<firsttoken/>
Run Code Online (Sandbox Code Playgroud)

-

我无法解释为什么它适用于逗号但不适用于句号.

Mat*_*ler 6

. 是XSLT(上下文节点的简写)和正则表达式(任何字母数字字符)中的特殊字符.

如果你想匹配文字"." 你需要在前面用反斜杠来逃避它.

我无法解释为什么它适用于逗号但不适用于句号.

标记化确实适用于句点.只是这.并不是首先被解释为一个时期.

样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:template match="/">
      <firsttoken><xsl:value-of select="tokenize(/value,'\.')[1]" /></firsttoken>
   </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

产量

<?xml version="1.0" encoding="UTF-8"?><firsttoken>a</firsttoken>
Run Code Online (Sandbox Code Playgroud)

  • +1.所以在@CraigJohnstone的原始示例中,`tokenize`函数_is_实际上按设计工作 - 你给出了一个匹配任何单个字符的`.`的分隔符正则表达式,因此tokenize会将每个字符视为一个分隔符并返回一个序列空字符串,您从中选择第一个. (2认同)