Единое определение пространства имен в XSLT - PullRequest
0 голосов
/ 24 мая 2018

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

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

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

<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

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

1 Ответ

0 голосов
/ 29 июня 2018

Единственное решение, которое приходит на ум, - это использовать сущность 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, но некоторые люди клянутся ими ...

...