Единое определение пространства имен в XSLT

У меня есть пространство имен, которое используется как динамически, так и статически.

Я хотел бы дать ему определение только один раз.

Динамическое использование выглядит так:

<xsl:variable name="fpml-ns" select="'http://www.fpml.org/2005/FpML-4-2'"/>
<xsl:function name="qt:some-function">
    <xsl:param name="pd"/>
    <xsl:sequence select="qt:other-function($fpml-ns, $pd)"/>
</xsl:function>

В конечном итоге это используется для установки namespace в теге element, который затем возвращается как результат функции. other-function можно использовать со многими пространствами имен, поэтому он динамический.

В том же XSLT-файле статическое использование выглядит следующим образом - пространство имен применяется только к определенному результирующему документу в XSLT:

<SWBML xmlns="http://www.fpml.org/2005/FpML-4-2" xsl:use-attribute-sets="swbml.ir">

Итак, строка "http://www.fpml.org/2005/FpML-4-2 "дважды появляется в моем XSLT-файле - и, хотя это не беда, я считаю дублирование неоптимальным.

Я также пытался сделать элемент SWBML динамическим, то есть:

<element name="SWBML" namespace="${fpml-ns}" use-attribute-sets="swbml.ir">

Однако согласно этому сообщению: Как я могу динамически установить объявление пространства имен по умолчанию для выходного XML-файла XSLT-преобразования?

Дочерние элементы не наследуют динамические пространства имен, как это было бы со статическим определением.

Я рассмотрел довольно уродливый обходной путь ссылки на текущий документ и его чтения так:

<xsl:variable name="fpml-ns" select="namespace-uri(document('')//node()[local-name()='SWBML'])"/>

Это работает, но вызывает проблемы при попытке выполнить оценку входных данных с учетом схемы, поскольку текущий документ затем проверяется с использованием пространства имен результата, приводящего к этой проблеме - Saxon преждевременно оценивает xsl: attribute-set

Есть ли разумный способ добиться единого определения пространства имен, на которое я затем могу ссылаться как статически, так и динамически?


person Phil    schedule 24.05.2018    source источник


Ответы (1)


Единственное решение, которое приходит на ум, - использовать объект XML:

<!DOCTYPE xsl:stylesheet [
  <!ENTITY ns "http://www.fpml.org/2005/FpML-4-2">
]>

....

<SWBML xmlns="&ns;" xsl:use-attribute-sets="swbml.ir">

....

<xsl:variable name="fpml-ns" select="'&ns;'"/>

Я не большой поклонник XML-сущностей, но некоторые люди ими доверяют ...

person Michael Kay    schedule 29.06.2018