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.
а пока... префиксуйте явно
|