【问题标题】:Converting values from document-uri() to strings in XSLT在 XSLT 中将值从 document-uri() 转换为字符串
【发布时间】:2014-10-10 12:32:49
【问题描述】:

我目前正在尝试使用 XSLT 转换更大的 XML 文档堆栈,并且正在使用 shell 脚本来执行此操作。但是,我收到以下错误:

唯一可以通过类型检查的值是一个空序列。 contains() 的第一个参数的必需项类型是 xs:string; 提供的值具有项目类型 xs:anyURI

当我在 xsl 中查找相应的行时,发现这可能是由于另一个脚本中定义的变量造成的。它的定义是这样的:

<xsl:variable name="crturi" select="document-uri(/)"/>

那么我的错误消息是否意味着我需要将 $crturi 的值转换为 thr 字符串格式才能进行处理?

【问题讨论】:

  • 您使用的是什么产品?它看起来像一条撒克逊错误消息:也许它是在实施 URI 到字符串提升之前的撒克逊旧版本?
  • 感谢您的回复。我不确定当时我使用的是哪个 Saxon 版本,因为我找不到要查找的命令,但由于我下载文件夹中的最新版本是 HE 9.5.1.6,我想我安装了那个。不过,这似乎只是一天的问题,因为现在一切正常。
  • 要找出您正在使用的 Saxon 版本,请在命令行上使用 -t 选项运行,或者将 system-property('xsl:product-version') 的结果放在消息中,或者在转换输出中的注释节点中.
  • 谢谢。我使用的是 Saxon-HE 9.5.1.6J 版本。我们目前正在尝试重现错误消息,但不确定是什么原因造成的。如果我们设法写一个最小的例子,我会再次发布。

标签: string xslt uri transformation


【解决方案1】:

您应该能够简单地将string($crturi) 用作contains 函数的参数。

【讨论】:

    【解决方案2】:

    xs:anyURI 类型通过称为type promotion 的概念自动转换为xs:string。您收到的错误似乎是您正在使用的产品中的错误。来自 XPath 规范,引用:

    xs:anyURI 类型的值(或从 xs:anyURI 限制派生的任何类型)可以提升为 xs:string 类型。

    Martin Honnen 的解决方案将在您的情况下解决它,但您应该考虑提出针对处理器的错误。或者,您可以使用$crturi treat as xs:string,但这也只是解决该错误的方法。

    我用ExseltSaxon 尝试了以下示例,但都没有抛出错误(如预期的那样)。

    <xsl:template match="/">
        <xsl:value-of select="contains(document-uri(/), 'any')" />
    </xsl:template>
    

    【讨论】:

    • 非常感谢您的回答。我仍然不知道发生了什么,因为错误似乎是一天的事情。它在我发布问题的那天出现了三次,而现在它完全消失了,甚至我最初的标记也有效。也许,这可能是因为我将变量声明移动到使用变量的样式表中。但是,它们从一开始就联系在一起,所以我认为没有必要。
    • 另外,我想对这两个答案都投赞成票,但遗憾的是我不能这样做,因为我还没有足够的声誉。
    • @aerdureth:如果您确实再次遇到它,并且可以重现它,那么请考虑将其作为错误报告发布给您的处理器供应商。我想,你可以在 15 分之后投票,这可能是在你关于 SO 的下一个问题之后;)。
    猜你喜欢
    • 2011-12-17
    • 2013-06-25
    • 2011-03-30
    • 2011-02-12
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多