gpt4 book ai didi

xslt - 从用户定义的函数返回 QNames

转载 作者:行者123 更新时间:2023-12-04 20:52:02 25 4
gpt4 key购买 nike

我正在尝试将 WSDL 定义转换为另一种格式以进行进一步处理,但遇到了问题。我似乎无法从函数返回 QName 值,而不会将它们转换为字符串。

我将文件缩减为以下内容,同时保留错误行为。原始函数应该使用 target-namespace 来翻译非前缀值。来自包含 <xs:schema> 的属性或 <wsdl:definitions> .

示例 XSLT 文档:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://www.example.com/xslt"
exclude-result-prefixes="#all" version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:function name="my:resolve-QName2" as="xs:QName">
<xsl:param name="name" as="xs:string"/>
<xsl:param name="element" as="element()"/>
<xsl:value-of select="resolve-QName($name,$element)"/>
</xsl:function>

<xsl:template match="/definitions">
<xsl:variable name="qname" select="my:resolve-QName2('xs:string',.)" as="xs:QName"/>
<QName>
<prefix><xsl:value-of select="prefix-from-QName($qname)"/></prefix>
<local><xsl:value-of select="local-name-from-QName($qname)"/></local>
<namespace><xsl:value-of select="namespace-uri-from-QName($qname)"/></namespace>
</QName>
</xsl:template>
</xsl:stylesheet>

输入文件:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"/>

预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<QName>
<prefix>xs</prefix>
<local>string</local>
<namespace>http://www.w3.org/2001/XMLSchema</namespace>
</QName>

运行上述代码时,Saxon 9.3.0.5 XSLT 处理器因错误而停止:

Required item type of result of function my:resolve-QName2() is xs:QName. Cannot convert string to type {xs:QName}



似乎引擎首先将 QName 转换为字符串,然后尝试将其转换回 QName,但失败了。如果我删除两个 as="xs:QName" ,我收到以下错误:

Required item type of first argument of prefix-from-QName() is xs:QName. Cannot convert string to type {xs:QName}



如何从函数返回 QName?

这是 Saxon XSLT 处理器中的错误,还是我对 XSLT 的误解?

是否有任何 XSLT 引擎能够处理上述文件?

最佳答案

问题出在这里 :

<xsl:value-of select="resolve-QName($name,$element)"/>

这将从 resolve-QName() 的 QName 生成一个文本节点(字符串)。返回。

然而 my:resolve-QName2声明为 xs:QName 类型-- 不是 xs:string这会导致正确报告的错误。

解决方案 :

将以上内容替换为:
<xsl:sequence select="resolve-QName($name,$element)"/>

现在当修正变换 :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="http://www.example.com/xslt"
exclude-result-prefixes="#all" version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:function name="my:resolve-QName2" as="xs:QName">
<xsl:param name="name" as="xs:string"/>
<xsl:param name="element" as="element()"/>
<xsl:sequence select="resolve-QName($name,$element)"/>
</xsl:function>

<xsl:template match="/definitions">
<xsl:variable name="qname" select="my:resolve-QName2('xs:string',.)" as="xs:QName"/>
<QName>
<prefix><xsl:value-of select="prefix-from-QName($qname)"/></prefix>
<local><xsl:value-of select="local-name-from-QName($qname)"/></local>
<namespace><xsl:value-of select="namespace-uri-from-QName($qname)"/></namespace>
</QName>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档 :
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"/>

产生了想要的、正确的结果 :
<QName>
<prefix>xs</prefix>
<local>string</local>
<namespace>http://www.w3.org/2001/XMLSchema</namespace>
</QName>

关于xslt - 从用户定义的函数返回 QNames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9354440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com