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