我目前正在尝试使用XSLT转换更大的XML文档堆栈,并使用shell脚本来执行此操作。但是,我收到以下错误:
唯一可以传递类型检查的值是空序列。 contains()的第一个参数的必需项类型是xs:string; 提供的值具有项目类型xs:anyURI
当我跟踪xsl中的相应行时,结果发现这可能是由于在另一个脚本中定义的变量。它的定义如下:
<xsl:variable name="crturi" select="document-uri(/)"/>
我的错误消息是否意味着我需要将$ crturi的值转换为thr字符串格式才能处理它?</ p>
答案 0 :(得分:2)
您应该只需使用string($crturi)
作为contains
函数的参数。
答案 1 :(得分:1)
xs:anyURI
类型可以通过名为type promotion的概念自动转换为xs:string
。您获得的错误似乎是您正在使用的产品中的错误。从XPath规范中引用:
xs:anyURI(或通过xs:anyURI限制派生的任何类型)的值可以提升为xs:string类型。
Martin Honnen的解决方案将在您的情况下解决它,但您应该考虑针对处理器提出错误。或者,您可以使用$crturi treat as xs:string
,但这也只是一种解决方法。
我使用Exselt和Saxon尝试了以下示例,但没有出现错误(正如预期的那样)。
<xsl:template match="/">
<xsl:value-of select="contains(document-uri(/), 'any')" />
</xsl:template>