Как условно указать тип схемы XML с помощью XSLT и Saxon

Я использую этот скрипт merge.xslt для объединения нескольких разных XML файлы в один. Этот инструмент очень полезен и включает параметр командной строки dontmerge, чтобы определенные элементы XML не объединялись. Проблема в том, что можно указать только один элемент XML, а мне нужно указать несколько элементов XML, которые не следует объединять. Я мог бы просто добавить в сценарий дополнительные параметры командной строки, например dontmerge2, dontmerge3 и т. д., но это не элегантное решение.

Изучая определенные элементы XML, которые нельзя объединять, я понял, что все они относятся к одному и тому же типу схемы XML, а именно:

<xs:element name="doCliCommand" type="cliParametersT">
</xs:element>
<xs:element name="undoCliCommand" type="cliParametersT">
</xs:element>

Итак, вместо того, чтобы использовать dontmerge для doCliCommand и undoCliCommand, я хотел бы иметь возможность сделать что-то вроде dontmergetype=cliParametersT

Соответствующая часть merge.xslt заключается в следующем:

  <xslt:param name="dontmerge" />
  ...
  <xslt:when test="$type1='element' and $type2='element' and
                   local-name($node1)=local-name($node2) and
                   namespace-uri($node1)=namespace-uri($node2) and
                   name($node1)!=$dontmerge and name($node2)!=$dontmerge">

Итак, вот вопрос: как мне изменить это конкретное тестовое условие xslt, чтобы иметь возможность проверять тип схемы XML? Я не нашел подходящих функций XPath, XQuery или XSLT для получения типа схемы.

Существует несколько связанный с этим вопрос, где они упоминают, что это невозможно сделать, если не используются расширения Saxon. Я использую SaxonHE9-5-1-3J.


person Brady    schedule 19.12.2013    source источник
comment
возможный дубликат Как проверить в XPATH, равен ли тип типу или является производным от типа   -  person ceving    schedule 19.12.2013
comment
@ceving хорошее замечание. Я вижу, что в представленном ответе говорится, что невозможно сделать то, что я прошу, если не использовать Saxon или связанные с ним расширения. Я использую Saxon, поэтому, возможно, мне следует соответствующим образом изменить вопрос, потому что я не знаю, как использовать эти расширения Saxon.   -  person Brady    schedule 19.12.2013
comment
Какой процессор XSLT вы используете или можете использовать? Существуют процессоры XSLT 2.0 с поддержкой схемы, которые могут помочь. MSXML 6 представляет собой процессор XSLT 1.0, но также поддерживает собственную проприетарную схему, см. msdn.microsoft.com/en-us/library/ms256453%28v=vs.110%29.aspx.   -  person Martin Honnen    schedule 19.12.2013
comment
@MartinHonnen Я обновил вопрос, упомянув, что я использую Saxon HE 9-5-1-3J.   -  person Brady    schedule 19.12.2013
comment
@ Брэди, я думаю, что Home Edition Saxon не поддерживает схему.   -  person Martin Honnen    schedule 19.12.2013


Ответы (1)


С процессором XSLT 2.0, поддерживающим схему, таким как Saxon-EE, вы можете писать

<xsl:when test=". instance of element(*, cliParametersT)">

Вам нужно убедиться, что схема импортирована в таблицу стилей с помощью xsl:import-schema, и вам нужно убедиться, что исходный документ действительно проверен на соответствие схеме (в Saxon используйте -val:strict в командной строке).

person Michael Kay    schedule 19.12.2013
comment
Похоже, это нужно жестко закодировать в xslt, учитывая, что мне также нужно импортировать схему? Я надеялся сделать его настраиваемым в командной строке. - person Brady; 19.12.2013
comment
@Brady: вы используете Saxon-HE, который не поддерживает схему. Другими словами, с вашей версией процессора Saxon XML нельзя проверить по схеме. - person Mathias Müller; 19.12.2013
comment
Верно, но что, если я перейду на версию EE? Нужно ли импортировать схему? - person Brady; 19.12.2013
comment
Да, добавить <xsl:import-schema> в качестве объявления верхнего уровня в таблицу стилей (думаю, в merge.xslt) проще всего. Также взгляните на: saxonica.com/documentation9.4- демо/html/схема-обработка/ - person Mathias Müller; 19.12.2013
comment
Проверку принадлежности к типу, имя которого неизвестно статически, можно выполнить с помощью динамической оценки XPath (xsl:evaluate в версии 3.0 или saxon:evaluate) или с помощью функции расширения saxon:type-annotation. - person Michael Kay; 19.12.2013