【问题标题】:Let is not supported in XPathXPath 不支持 Let
【发布时间】:2022-01-08 10:08:29
【问题描述】:

最近我升级了我的服务器,以下带有 Saxonb-XSLT 的 XSLT 停止工作:

<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:output cdata-section-elements="title"/>

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

  <xsl:template match="title[ends-with(., 'Apple') or ends-with(., 'Samsung') or ends-with(., 'Banana')]">
      <xsl:copy>
          <xsl:value-of select="let $words := tokenize(., '\s+') 
               return (subsequence($words, 1, count($words) - 2), $words[last()], $words[last() - 1])"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

我得到错误:

  XPST0003: XPath syntax error at char 0 on line 13 in {let $}:
    'let' is not supported in XPath

我还没有升级 saxonb-xslt(来自 Saxonica 的 Saxon 9.1.0.8J)。有人知道为什么它不能正常工作吗?

【问题讨论】:

    标签: xml xslt saxon


    【解决方案1】:

    您可以通过重写模板以使用 XSLT xsl:variable 语句而不是 XPath 3.0 let 语句来绕过对 let 的需求以及任何相关版本或许可复杂性:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    exclude-result-prefixes="#all"
                    version="2.0">
    
      <xsl:output cdata-section-elements="title"/>
    
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
      
      <xsl:template match="title[   ends-with(., 'Apple') 
                                 or ends-with(., 'Samsung') 
                                 or ends-with(., 'Banana')]">
        <xsl:variable name="words" select="tokenize(., '\s+')"/>
        <xsl:copy>
            <xsl:value-of select="subsequence($words, 1, count($words) - 2), 
                                  $words[last()], 
                                  $words[last() - 1]"/>
        </xsl:copy>
      </xsl:template>
    
    </xsl:stylesheet>
    

    更新:我已经替换了&lt;xsl:mode on-no-match="shallow-copy"/&gt; 使用传统的身份转换来全面减少从 XSLT 3.0 到 XSLT 2.0 的依赖。感谢@michael.hor257k 的建议。

    【讨论】:

    • @michael.hor257k:说得好。答案已更新。谢谢!
    【解决方案2】:

    您提到了来自 Saxonica 的 Saxon 9.1.0.8J。那确实是一个非常旧的版本(2009 年),它永远无法运行这个样式表。

    我担心,不知何故,您的“升级”导致您运行的是较旧的 Saxon 版本。

    当前版本是 10.6。

    【讨论】:

      【解决方案3】:

      我认为let 绑定是 XPath 3 的一部分,因为在 Saxon 9.8 HE 之前的 XSLT 3.0 中不完全支持它,因为这是第一个支持 XPath 3 推荐的最终 XSLT 3.0 的 Saxon 开源版本.您可能会发现使用version="3.0",然后使用let 的XPath 3 表达式也可以在9.7 和9.6 中工作,但在更旧的版本中,Saxon(至少是开源版本)是支持XPath 2.0 的XSLT 2.0 处理器,并且不支持'不支持任何 XPath 3 表达式(如 let)。

      文字错误消息'let' is not supported in XPath 可能表明该版本在XQuery 中对let 有一些支持,但我不记得细节,也没有检查过。

      不清楚您在升级之前使用的是哪个 Saxon 版本,升级之后使用的是哪个版本,或者您进行了哪种“更新”。

      【讨论】:

        猜你喜欢
        • 2018-05-31
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多