Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: BradyОтветов: 1

Я использую этот скрипт 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.

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

xmlxpathxsltsaxonxquery

Ответы

Ответ 1 · рейтинг 1 · Michael Kay

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы