我试图将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处理器正在停止,并出现错误:
似乎引擎首先将QName转换为字符串,然后尝试将其转换回QName,这将失败。如果删除两个
as="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 - 从用户定义的函数返回QName,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9354440/