Я пытаюсь преобразовать определение 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, способный обработать вышеуказанный файл?