即使在线正则表达式测试正确匹配,XSLT正则表达式也不匹配

时间:2019-01-09 10:32:11

标签: regex xslt xslt-2.0 pcre

给出示例路径C:\ example \ innerExample \ file.txt,我想使用此正则表达式提取带有扩展名的文件名,您可以see it here

<xsl:analyze-string select="$filePath" regex="$regexPattern" flags="mis">
  <xsl:matching-substring>
    <xsl:value-of select="concat(regex-group(2), regex-group(3))"/>
  </xsl:matching-substring>
</xsl:analyze-string>

这是我的xslt代码,我缺少什么吗?

2 个答案:

答案 0 :(得分:1)

无需进行尝试(我无法复制),我相信您可以使用以下方式提取带有扩展名的文件名:

<xsl:value-of select="tokenize($filepath, '\\')[last()]"/>

演示http://xsltransform.hikmatu.com/6qVRKvN

答案 1 :(得分:1)

您尚未向我们展示具有正确值的完整但最少的示例,但已进行了纠正,即没有在方括号中转义/,我认为您的模式适用于XSLT / XPath 2及更高版本: >

输入

<root>
    <data>C:\example\innerExample\file.txt</data>
</root>

已通过

转换为https://xsltfiddle.liberty-development.net/jyRYYhM
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:param name="regexPattern" as="xs:string">^(.*)[/|\\](.*)(\..*)</xsl:param>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="data">
      <xsl:copy>
          <xsl:analyze-string select="." regex="{$regexPattern}" flags="mis">
              <xsl:matching-substring>
                <xsl:value-of select="concat(regex-group(2), regex-group(3))"/>
              </xsl:matching-substring>
          </xsl:analyze-string>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

进入

<root>
    <data>file.txt</data>
</root>

(我在那里使用过XSLT 3,但我认为XSLT 2和3之间在xsl:analyze-string方面没有变化)。