У меня есть пространство имен, которое используется как динамически, так и статически.
Я хотел бы дать ему определение только один раз.
Динамическое использование выглядит так:
<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
Есть ли разумный способ добиться единого определения пространства имен, на которое я затем могу ссылаться как статически, так и динамически?