xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Проблема: XPath-выражение для namespace без префикса


Автор Сообщение
Paranorm
Студент

Зарегистрирован: 24.04.2002
Сообщения: 81

Посетить сайт автора
[2252] Вс Янв 05, 2003 00:00
Проблема: XPath-выражение для namespace без префикса
Есть, предположим, простой документ:

Код:


<?xml version="1.0"?>
<a>
      <b>Text</b>
</a>



XPath-выражение: "/a/b" замечательно возвращает мне нужное значение.
НО, если в документе появляется пространство имен по умолчанию:

Код:


<?xml version="1.0"?>
<a xmlns="urn:a">
      <b>Text</b>
</a>



то тоже самое XPath-выражение НЕ работает (разбираю его в MSXML скриптом)!
А как нужно правильно составлять xpath-запросы в этом случае???
_________________
Программист - это человек, который решает проблемы, о которых вы не знали, таким способом, который вы не понимаете...
taler
Аспирант

Зарегистрирован: 28.04.2002
Сообщения: 113

[2253] Пн Янв 06, 2003 00:00
Re: XPath-выражение. HELP!!!
вопрос и очень хороший (хорошо бы тоже узнать, как лучше всего) и очень "теоретически безобразный" (насколько я когда-то интересовался, был вылит океан  чернил и, имхо, мало кто все равно понимал/понял, как точно надо). Проблема не столько в том, что пространство тут умалчиваемое, сколько, что нулевое (без префикса).

a) что-то мешает "как белые люди", работать с префиксами?

c т. з. практики:
b) в любом случае должно работать select="*[name()='a']/*[name()='b']" ?
(без префикса что name(), что local-name() - один черт..)

c) можно и ввести в стиле отдельный явный префикс, скажем :

Код:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:m="urn:a">

<xsl:template match="/">
  <xsl:value-of select="m:a/m:b"/>
</xsl:template>
</xsl:stylesheet>


ps1: Предупреждение: написанное может быть не совсем точным - теория какая-то, имхо, вообще тут кривая (для 0-го namespace), тем более, есть различия между XSLT-1 и XSLT-2; причем давно этой областью не занимался, но если возникнут уточнения, свистну. С другой стороны, если кто прояснит больше, можно было бы лишь поприветствоовать

ps2: цитата из моего старого, помещенного здесь же [url=http://xmlhack.ru/forum/xml/YaBB.pl?board=prog;action=display;num=1020682313;start=15
]перевода Шена[/url]:

Цитата:

совет: по возможности стараться вообще по минимуму пользоваться пространствам имен. Если без них не обойтись, размещайте их не далее корневого элемента. А самое главное, держите свой koshelek.bbspam.com подальше от тех, кто пытается внушить вам, что в пространствах имен вообще все элементарно...

taler
Аспирант

Зарегистрирован: 28.04.2002
Сообщения: 113

[2254] Пн Янв 06, 2003 00:00
Re: XPath-выражение. HELP!!!
В 2000 г. Microsoft описывала это так:

Цитата:

Для неквалифицированных имен элементов (без префикса), все такие элементы считаются частью нулевого (Null) пространства имен (даже если во входном документе есть объявление умалчиваемого пространства имен). Например, для документа:

<foo xmlns='urn:foo-bar:baz'>
  <bar><baz/></bar>
</foo>

что должно возвращаться по /foo/bar/baz ? Согласно спецификации XPath, не должно возвращаться ничего, поскольку запрашиваются элементы foo, bar и baz, не принадлежащие никакому пространству имен. Тогда как во входном документе все элементы foo, bar и baz принадлежат пространству имен urn:foo-bar:baz.

... Однако, до вычисления XPath выражения в MSXML 3.0 нет встроенного механизма для установки привязок пространств имен. Из-за этого к XML документам с непрефиксированными пространствами имен невозможно строить правильные запросы...


поэтому в требованиях к 2.0 можно теперь вычитать следующее:

Цитата:

2.1 Must Allow Matching on Default Namespace Without Explicit Prefix

Many users stumble trying to match an element with a default namespace. They expect to be able to do something like:

<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns="urn:myuri">
 <!-- Expect this matches <foo> in default namespace -->
 <xsl:template match="foo">

thinking that leaving off the prefix from the foo element name, that it will match <foo> elements in the default namespace with the URI of urn:myuri.

Instead, they are required to assign a non-null prefix name to their namespace URI and then match on "someprefix:foo"

Instead, which has proven to be far from obvious . XSLT 2.0 SHOULD provide an explicit way to handle this scenario to avoid further user confusion.



а пока... префиксуйте явно Wink