Расширенное имя элемента (то есть пара (пространство имен, локальное имя)) полностью определяется инструкцией, которая создает элемент; это никак не зависит от родительского элемента в дереве результатов. Вы никогда не можете полагаться на элемент, входящий в то же пространство имен, что и его родитель.
Для буквального элемента результата, такого как <Foo>
или <p:Bar>
, расширенное имя элемента в дереве результатов совпадает с расширенным именем элемента в таблице стилей. То есть это определяется правилами спецификации пространств имен XML: URI пространства имен определяется объявлениями пространства имен xmlns в таблице стилей (которые могут появляться в самом элементе буквального результата или в любом элементе-предке). Это, в свою очередь, означает, что пространство имен является статической константой, оно не может быть вычислено динамически.
Для элемента, созданного с использованием xsl: element, существует два способа задания пространства имен. Если присутствует атрибут namespace
, то его эффективное значение (интерпретируемое как AVT) устанавливает URI пространства имен сконструированного элемента. Поскольку это AVT, пространство имен может быть вычислено динамически.
При отсутствии атрибута namespace
значение атрибута name
интерпретируется как лексическое QName, а пространство имен определяется так же, как и для литерального элемента результата, с использованием объявлений пространства имен, которые находятся в область действия для инструкции xsl:element
в таблице стилей. С помощью этого механизма вы можете динамически выбирать между фиксированным набором статически известных пространств имен, но вы не можете вычислить пространство имен полностью динамически:
<xsl:stylesheet xmlns:a="http://one-uri/" xmlns:b="http://another-uri/">
....
<xsl:element name="{if (x) then 'a' else 'b'}:foo">