Как получить пространство имен узла в xslt? - PullRequest
4 голосов
/ 27 декабря 2011

Я, вероятно, делаю что-то глупое, держу пари, что есть более простой способ ... Мне нужен доступ к пространству имен узла.Элементы в моем xml выглядят, например, так:

<somenamespace:element name="SomeName">

Затем в моем xslt я получаю доступ к этим элементам с помощью:

 <xsl:template  match="*[local-name()='element']">
    <xsl:variable name="nodename">
      <xsl:value-of select="local-name(current())"/>
    </xsl:variable>

<xsl:choose>
  <xsl:when test="contains($nodename,':')">

Ну, конечно, это не работает, потому чтонет пространства имен "somenamespace" даже в совпадении с шаблоном ...

Кто-нибудь может мне помочь, что я ищу?

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

Мне кажется, что вы хотите проверить, находится ли узел в ненулевом пространстве имен. Правильный способ сделать это -

namespace-uri() != ''

Вы не должны смотреть, имеет ли лексическое имя префикс или содержит двоеточие, потому что, если узел находится в пространстве имен, его можно записать либо с префиксом, либо без него, а две формы эквивалентны. 1004 *

Но я догадываюсь, каково ваше реальное, основное требование.

1 голос
/ 28 декабря 2011

Из комментария ОП:

Я ищу способ доступа к префиксу somenamespace.

Вы можете получить доступ к префиксу имени текущего узла с помощью :

substring-before(name(), ':")

Другой способ :

substring-before(name(), local-name())

Выше приведено либо пустая строка '', либо префикс, за которым следует символ ':'.

Чтобы проверить, имеет ли префикс имя текущего узла :

not(name() = local-name())
1 голос
/ 27 декабря 2011

Вы ищете функцию name, например:

<xsl:value-of select="name()"/>

возвращает somenamespace:element

...