如何解决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 不是关于选择空节点集的具体内容。
问题:这是 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 举报,一经查实,本站将立刻删除。