XSLT: Как избавиться от префиксов пространства имен по умолчанию в XPath? (Xmlns = "...") - PullRequest
3 голосов
/ 16 февраля 2012

У меня есть шаблон:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="urn:jboss:domain:1.1"
    xmlns:d="urn:jboss:domain:1.1"
            >

...

<xsl:template match="//d:interfaces/d:interface[@name='management']/d:inet-address">
    ...
</xsl:template>

Это работает.

<xsl:template match="//interfaces/interface[@name='management']/inet-address">
    ...
</xsl:template>

Почему это не работает, несмотря на то, что у меня установлено пространство имен по умолчанию?

1 Ответ

4 голосов
/ 16 февраля 2012
<xsl:template match="//interfaces/interface[@name='management']/inet-address">
     ... 
</xsl:template> 

Почему это не работает, несмотря на то, что у меня установлено пространство имен по умолчанию?

Это один из самых часто задаваемых вопросов в любом списке XSLT и / или XPath.

XPath рассматривает любое нефиксированное имя как принадлежащее «без пространства имен» - независимо от того, что пространство имен по умолчанию может быть определено и находится в области действия.

Цитировать спецификацию W3C XPath 1.0 :

" QName в тесте узла раскрывается в расширенное имя с использованиемобъявления пространства имен из контекста выражения. Аналогичным образом выполняется расширение для имен типов элементов в начальных и конечных тегах, за исключением того, что пространство имен по умолчанию, объявленное с помощью xmlns, не используется: если QName не имеет префикса, то URI пространства именis null"

Поэтому приведенное выше правило шаблона соответствует элементам, которые не находятся в" пространстве имен ", но элементы документа XML находятся в пространстве имен "urn:jboss:domain:1.1", поэтому не являютсяодин узел мав соответствии с вышеуказанным правилом.

...