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