xslt ожидает элемент вместо xsl:for-each

Поскольку я новичок в xslt/xsd-программировании, я использую XMLSpy для создания преобразования xml2xml. Для обоих xml у меня есть xsd. К сожалению, следующий фрагмент кода недействителен.

<xsl:template match="/">
    <table xsi:noNamespaceSchemaLocation="table.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <xsl:for-each select="table/body/line">
            <row>
            </row>
        </xsl:for-each>
    </table>
</xsl:template>

В сообщении об ошибке говорится, что элемент строки ожидается после таблицы.
Подробности (переведено): элемент <xsl:for-each> не ожидался типа {anonymous} элемента <table>.

Проблему можно решить, удалив ссылку на xsd или удалив оператор for-each.
Однако я не могу понять, что не так. Насколько я понимаю, цикл for-each должен просто повторять теги <row> для каждой строки в первом xml.
Вот часть xsd цели.

<xs:element name="table">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="row" maxOccurs="unbounded"/>
            <xs:element ref="Metadata" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

person F. Hall    schedule 30.06.2016    source источник
comment
Что ж, схема определяет, как должен выглядеть результат XSLT-преобразования, а не то, как выглядит XSLT. Код XSLT обычно представляет собой смесь инструкций XSLT и элементов результата и, очевидно, таким образом не соответствует схеме результата. Поэтому при написании XSLT я бы просто проигнорировал это сообщение. Или вы действительно получаете сообщение об ошибке, которое не позволяет вам запустить XSLT-преобразование в XMLSpy?   -  person Martin Honnen    schedule 30.06.2016
comment
На самом деле, я не пытался запустить XSL-преобразование... но оно работает. Думаю, я пока проигнорирую это сообщение. Спасибо.   -  person F. Hall    schedule 30.06.2016


Ответы (1)


Я подозреваю, что Altova использует наличие атрибута xsi:noNamespaceSchemaLocation="table.xsd" как сигнал, означающий «пожалуйста, проверьте этот элемент на соответствие схеме в table.xsd»; это не то, что вы хотели, потому что, конечно, это недопустимо для этой схемы, поскольку она содержит инструкции XSLT для создания необходимых элементов, а не содержит сами требуемые элементы.

Чтобы обойти это, попробуйте сгенерировать атрибут с помощью xsl:attribute:

 <table xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <xsl:attribute name="xsi:noNamespaceSchemaLocation">table.xsd</xsl:attribute>
   <xsl:for-each select="table/body/line">
            <row/>
   </xsl:for-each>
 </table>
person Michael Kay    schedule 30.06.2016
comment
Это кажется возможным, поскольку сообщение больше не появляется при использовании вашего кода. (Немного удивительно, так как есть примеры из Altova, которые используют тот же метод, что и я, и которые являются действительными). Спасибо. - person F. Hall; 30.06.2016