首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从用户定义的函数返回QNames

从用户定义的函数返回QNames
EN

Stack Overflow用户
提问于 2012-02-19 23:36:33
回答 1查看 2.2K关注 0票数 5

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

我将文件简化为以下内容,同时保留错误行为。最初的函数应该使用target-namespace属性从包含的<xs:schema><wsdl:definitions>中转换非前缀值。

示例XSLT文档:

代码语言:javascript
复制
<?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>

输入文件:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"/>

预期结果:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<QName>
    <prefix>xs</prefix>
    <local>string</local>
    <namespace>http://www.w3.org/2001/XMLSchema</namespace>
</QName>

当运行上述代码时,Saxon9.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处理程序中的一个bug,还是我对XSLT的误解?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-20 01:51:57

,问题在这里,

代码语言:javascript
复制
<xsl:value-of select="resolve-QName($name,$element)"/>

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

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

溶液

将上述内容改为:

代码语言:javascript
复制
<xsl:sequence select="resolve-QName($name,$element)"/>

现在更正转换

代码语言:javascript
复制
<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文档

代码语言:javascript
复制
<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"/>

想要的,正确的结果产生

代码语言:javascript
复制
<QName>
   <prefix>xs</prefix>
   <local>string</local>
   <namespace>http://www.w3.org/2001/XMLSchema</namespace>
</QName>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9354440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档