2016-06-30 9 views
1

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

<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> не ожидал от типа {анонимного} элемента <table>.

Проблема может быть решена путем удаления ссылки на xsd или удаления инструкции for-each.
Однако я не могу понять, что не так. Насколько я понимаю, for-each-loop должен просто повторять теги <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> 
+0

Ну, схема определяет, как результат трансформации XSLT должен выглядеть, не так, как XSLT выглядит. Код XSLT обычно представляет собой смесь команд XSLT и элементов результатов, и, очевидно, этот способ не соответствует схеме для результата. Поэтому при написании XSLT я просто проигнорировал бы сообщение. Или вы действительно получаете сообщение об ошибке, которое предотвращает запуск XSLT-преобразования в XMLSpy? –

+0

На самом деле, я не пытался запустить XSL-преобразование ... но он действительно работает. Наверное, сейчас я проигнорирую сообщение. Благодарю. –

ответ

1

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

Чтобы обойти эту проблему, попробуйте генерации атрибута с помощью XSL: атрибут:

<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> 
+0

Это похоже на возможность, поскольку сообщение больше не появляется при использовании вашего кода. (Немного удивительно, потому что есть примеры из Altova, которые используют тот же самый метод, который я использовал и которые действительны). Спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^