Возвращение QNames из пользовательской функции - PullRequest
4 голосов
/ 20 февраля 2012

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

1 Ответ

2 голосов
/ 20 февраля 2012

Проблема здесь :

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

Это создает текстовый узел (строку) из QName, который возвращает resolve-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>
...