2011-12-27 10 views
4

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

<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 «пространство имен даже в шаблоне соответствует ...

Может ли кто-нибудь вести меня, что я ищу?

+0

Вы должны сообщить нам, что вы ищете и что не работает. – kosa

+0

Где вы нашли функцию 'local-namespace'? –

+0

Ой, черт возьми, это ошибка. Исправлено - я имел в виду локальное имя. Я ищу способ получить доступ к префиксу «somenamespace». Он не работает, потому что local-name возвращает только часть «element». – aurel

ответ

1

Вы ищете name функции, e..g .:

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

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

1

Из комментария OP в:

Я ищу способ получить доступ к префикс «somenamespace».

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

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

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

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

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

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

not(name() = local-name()) 
3

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

namespace-uri() != '' 

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

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

Смежные вопросы