微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XSLT 3: xsl:analyze-string of empty nodeset 不执行 xsl:non-matching-substring

如何解决XSLT 3: xsl:analyze-string of empty nodeset 不执行 xsl:non-matching-substring

我正在使用 xsl:analyze-string 来解析节点内可能不存在的文本。

<xsl:analyze-string select="inexistant" regex="^([0-9]+)$">

根据XSLT 3.0

如果选择表达式的计算结果为空 序列,它被视为零长度字符串。

我希望分析字符串发现一个空字符串与我的正则表达式不匹配,因此 

xsl:non-matching-substring 被执行。但这实际上并没有发生:相反,analyze-string 不会产生任何结果。

我在 Oxygen-XML 中使用 Saxon 9.9.1.7。 Saxonica's analyze-string documentation 不是关于选择空节点集的具体内容

XSLT Fiddle here 显示

  • 问题:我希望 empty-select 元素包含文本“不匹配”
  • 解决方法:在测试字符串和正则表达式之前添加“x”,以便分析字符串获得非空字符串。不优雅。

问题:这是 Saxon 9 中的错误还是我误解了 XSLT 3.0 规范?

解决方法

我认为 Saxon 的行为符合以下部分的规定:

处理器首先将当前位置设置为零位置, 和当前不匹配的子字符串为零长度字符串

如果没有匹配:

如果当前位置是最后一个位置(即刚好在 最后一个字符):

如果当前非匹配子串的长度大于零, 评估 xsl:non-matching-substring 序列构造函数 当前不匹配的子串作为上下文项。

退出。

因此,空序列被视为零长度字符串是正确的,但由于零长度字符串不会产生任何不匹配的子字符串,因此不会评估 xsl:non-matching-substring

测试用例 https://github.com/w3c/xslt30-test/blob/master/tests/insn/analyze-string/analyze-string-035.xsl 在测试套件中进行检查,这样做

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    
      <!-- PURPOSE: test xsl:analyze-string applied to an empty sequence - error in 2.0,treated as "" in 2.1. -->
      
      <xsl:param name="in" select="()"/>
    
      <xsl:template match="/">
        <out>
          <xsl:analyze-string select="$in" regex="[A-Z]">
           <xsl:matching-substring><m/></xsl:matching-substring>
           <xsl:non-matching-substring><n/></xsl:non-matching-substring>
          </xsl:analyze-string>      
        </out>
      </xsl:template>
      
    
    </xsl:stylesheet>

它应该 (https://github.com/w3c/xslt30-test/blob/master/tests/insn/analyze-string/_analyze-string-test-set.xml#L288) 产生结果 <out/>

无论如何,当您使用 XSLT 3 时,您可能想看看 analyze-string 函数是否是您可以执行的替代方法,例如let $analyze-result := analyze-string(inexistant,'^([0-9]+)$') return if (not($analyze-result/*)) then (: handle nor match nor non-match here :) else ...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。