BaseX XQuery не возвращает корневой элемент

Я пытаюсь использовать XQuery такой поиск с BaseX:

XQUERY doc("ann-20140201.xml")//xbrl

Я отправляю небольшой отрывок из оригинала пример:

<?xml version="1.0" encoding="US-ASCII"?>
<xbrli:xbrl xmlns:ann="http://www.anninc.com/20140201" xmlns:dei="http://xbrl.sec.gov/dei/2013-01-31" xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:us-gaap="http://fasb.org/us-gaap/2013-01-31" xmlns:xbrldi="http://xbrl.org/2006/xbrldi" xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <link:schemaRef xlink:href="ann-20140201.xsd" xlink:type="simple" />
  <xbrli:context id="FD2011Q4YTD">
    <xbrli:entity>
      <xbrli:identifier scheme="http://www.sec.gov/CIK">0000874214</xbrli:identifier>
    </xbrli:entity>
    <xbrli:period>
      <xbrli:startDate>2011-01-30</xbrli:startDate>
      <xbrli:endDate>2012-01-28</xbrli:endDate>
    </xbrli:period>
  </xbrli:context>
  <xbrli:context id="FD2011Q4YTD_ann_EarningsPerShareReconciliationAxis_ann_EarningsPerShareBasic.Member">
    <xbrli:entity>

Однако даже если ясно, что <xbrl> является корневым элементом, когда я выполняю запрос с помощью BaseX, он ничего не возвращает!

Как можно ничего не вернуть, если эквивалентная команда возвращает корень?

Эквивалентная команда:

XQUERY doc("ann-20140201.xml")//*

person Codo    schedule 09.06.2014    source источник


Ответы (3)


Ваш корневой элемент {http://xbrl.org/2003/instance}xbrl. Ваш запрос ищет xbrl. Это не одно и то же.

Пытаться:

declare namespace xbrli=http://xbrl.org/2003/instance;
doc("ann-20140201.xml")//xbrli:xbrl
person Charles Duffy    schedule 09.06.2014
comment
Вау ~ Как атрибут может быть корневым элементом? я имею в виду, что у нас есть символ ‹и рядом с ним имя элемента. Пожалуйста, подскажите немного. - person Codo; 09.06.2014
comment
@Codo, корневой элемент начинается с <xbrli:xbrl>. Часть слева от : определяет пространство имен, а xmlns:xbrli указывает URL-адрес, на который он указывает. - person Charles Duffy; 09.06.2014
comment
Я считаю, что это именно этот xmlns:xbrli="http://www.xbrl.org/2003/instance". Я прав? - person Codo; 09.06.2014
comment
Да, это объявление пространства имен, используемое для любого элемента в его области действия, имя которого начинается с xbrli:. - person Charles Duffy; 09.06.2014

Как уже было показано в предыдущем ответе, вам необходимо указать URI пространства имен. Еще один способ сделать это:

doc("ann-20140201.xml")//Q{http://www.xbrl.org/2003/instance}xbrl

Если вы ленивый типограф, вы также можете использовать подстановочный знак:

doc("ann-20140201.xml")//*:xbrl
person Christian Grün    schedule 09.06.2014

Это проблема с пространством имен. Пространства имен особенно важны при объединении XML из разных источников, например. встраивание (X) HTML в RSS-каналы, где некоторые элементы могут иметь одинаковые имена, но разные значения.

Чтобы решить проблему, зарегистрируйтесь и используйте это пространство имен:

declare namespace xbrli = "http://www.xbrl.org/2003/instance";
doc("ann-20140201.xml")//xbrli:xbrl

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

person Jens Erat    schedule 09.06.2014