Саксонский преждевременно оценивает xsl: attribute-set - PullRequest
0 голосов
/ 23 мая 2018

Это относится к проверке входных данных в преобразование XSLT на основе схемы с использованием самой последней версии Saxon EE 9.8.

Мой файл XSLT содержит следующее.

Пространство имен и связанная схема, определенные как таковые:

<xsl:import-schema namespace="http://www.fpml.org/2005/FpML-4-2" schema-location="/path/to/some_swbml.xsd"/>

Результирующий документ, соответствующий вышеуказанной схеме:

<xsl:result-document method="xml" href="{$file}" format="swbml-format" validation="strict">
    <SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="ir">
        GENERATE SOME MORE XML TO BE VALIDATED BY THE XSD
    </SWBML>
 </xsl:result-document>

Вы заметите, что родительский тег в результирующем документе <SWBML> использует набор атрибутов xsl:use-attribute-sets="ir".

Набор атрибутов определен следующим образом:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:attribute-set name="ir">
        <xsl:attribute name="version">4-2</xsl:attribute>
    </xsl:attribute-set>
</xsl:stylesheet>

Это пример с игрушкой, шаблон не оправдан выше!

Это прекрасно работает, когда я используюэто с:

 java net.sf.saxon.Transform -sa -ext:on -it -o:output.xml -xsl:example.xslt

Это ожидается, потому что "-sa" будет проверять только выданный XML-документ, насколько я понимаю.

Это не работает:

java net.sf.saxon.Transform -val:lax -ext:on -it -o:output.xml -xsl:example.xslt

Предоставление:

FORG0001: Attribute @xsl:use-attribute-sets is not allowed on element <SWBML>

Мой вопрос - разве валидатор не должен обрабатывать наборы атрибутов, прежде чем пытаться проверить <SWBML>?Мне кажется, что он жалуется на то, что инструкция XSLT не разрешена в выходном XML-документе, что, конечно, верно, но, кажется, проверяет преждевременно.

Полученный XML действителен:

<SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" version="4_2">

Как показывает преобразование с опцией "-sa".

Я не уверен, является ли это ограничением XSLT или ошибкой саксонской обработки?Такое чувство, что я должен быть в состоянии сделать это со мной!

Есть идеи?

1 Ответ

0 голосов
/ 23 мая 2018

Мне не удалось воспроизвести это.

Я запустил эту таблицу стилей:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  version="3.0">

  <xsl:import-schema namespace="http://www.fpml.org/2005/FpML-4-2">
    <xs:schema targetNamespace="http://www.fpml.org/2005/FpML-4-2">
      <xs:element name="SWBML">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="version" type="xs:decimal"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </xsl:import-schema>

  <xsl:template name="xsl:initial-template">
    <xsl:result-document method="xml" validation="strict">
      <SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="ir">
        GENERATE SOME MORE XML TO BE VALIDATED BY THE XSD
      </SWBML>
    </xsl:result-document>
  </xsl:template> 

    <xsl:attribute-set name="ir">
      <xsl:attribute name="version">4.2</xsl:attribute>
    </xsl:attribute-set>


</xsl:transform>

, используя параметры командной строки:

-xsl:test.xsl -sa -val:lax -it -t

и этоработает нормально.

Мне кажется, что по какой-то причине вы проверяете саму таблицу стилей.Возможно, таблица стилей использует конструкцию document("") для чтения собственного исходного кода, и в этом случае слабая проверка вступит в действие и станет причиной этого сбоя.Если это не объяснение, пожалуйста, предоставьте более подробную информацию о том, что именно вы делаете.

...