找出 XSLT/XPATH 中变量的数据类型



似乎 xpathinstance ofcastable as运算符为我提供了一个布尔结果以供猜测......换句话说,我找不到一种方法来发现变量的类型,而无需事先使用"是或否"条件猜测它。

假设我没有 IDEA类型是什么,我所能做的就是询问变量$x是否具有xs:string的数据类型,或者是否实际上是xs:integer等,对于所有可能的xslt数据类型,没有得到直接答案。

<xsl:function name="findType">
<xsl:param name="var"/>
<xsl:choose test="not(string(.) castable as xs:integer)">
<xsl:when test="$var instance of xs:integer">
<xsl:value-of select="'xs:integer'" />
</xsl:when>
<xsl:when test="$var instance of xs:string">
<xsl:value-of select="'xs:string'" />
</xsl:when>
...
<xsl:otherwise>
<xsl:value-of select="'unknown'" />
</xsl:otherwise>
</xsl:choose>
</xsl:function>

有没有办法直接获取变量的数据类型,而无需切换情况?

通常,XDM值属于任意数量的类型,询问"类型"是什么是没有意义的。这在 XPath 3.0 映射中最为明显,在 XPath 3.0 映射中,很明显类型系统是格而不是层次结构。

但是,对于绝大多数常用值,项目有一个相当直观的"最具体的用户可见类型"概念,正是因为这个概念是直观的而不是正式的,所以你会发现它是由扩展函数而不是内置函数提供的。(另一个原因是类型不是XDM中的一类对象,因此不清楚如何表示"X的类型是什么?"问题的答案(。

对此功能的另一个反对意见是,它很容易被滥用。如果 X 是整数,询问if (typeof(X) == decimal) ...会给出结果"false",尽管整数是十进制的子类型。如果abs(X)的实现发生更改,以便在 X 为整数时返回整数,则询问结果是否为小数的现有代码将中断。"实例"运算符要安全得多。

请参阅 functx 库 http://www.xsltfunctions.com/的三个函数functx:node-kindhttp://www.xsltfunctions.com/xsl/functx_node-kind.html、functx:atomic-typehttp://www.xsltfunctions.com/xsl/functx_atomic-type.html 和functx:sequence-typehttp://www.xsltfunctions.com/xsl/functx_node-kind.html 中采用的方法。

具体到商业版本(撒克逊的PE和EE(,您还可以找到 http://saxonica.com/html/documentation/functions/saxon/type-annotation.html 和 http://saxonica.com/html/documentation/functions/saxon/type.html 有用的。

最新更新