Выберите единственный первый узел соответствия в XPath

У меня есть следующий XML:

<parent>
   <pet>
      <data>
         <birthday/>
      </data>
   </pet>
   <pet>
      <data>
         <birthday/>
      </data>
   </pet>
</parent> 

И теперь я хочу выбрать первый элемент дня рождения через parent//birthday[1] но это возвращает оба элемента дня рождения, потому что bothof их являются первым ребенком своих родителей.

Как я могу только выбрать первый элемент дня рождения всего документа, неважно, где он расположен. Я попробовал parent//birthday[position()=1] но это не работает также.

9
задан Tomalak 29 October 2018 в 12:41
поделиться

5 ответов

Вы имеете в виду (обратите внимание на скобки!)

(/parent/pet/data/birthday)[1]

или, более короткий, но менее специфический вариант:

(/*/*/*/birthday)[1]
(//birthday)[1]

или, более семантические, «День рождения первого питомца» :

/parent/pet[1]/data/birthday

Или, если не все домашние животные имеют записи на день рождения, «День рождения первого домашнего животного, для которого набор день рождения» :

/parent/pet[data/birthday][1]/data/birthday

Если вы работаете из контекста, Вы можете сократить выражение, сделав его относительно этого контекстно-узла.

Объяснение:

  • / Родитель / ПЭТ / Данные / день рождения [1] Выбирает все <день рождения> узлов, которые являются первыми в своих соответствующих родителях ( <данные> Узлы), по всему документу
  • (/ / / peat / pet / data / день рождения) [1] выбирает все <день рождения> узлов, а из них (Это то, что делают скобки, они создают промежуточный узел), он принимает первый
15
ответ дан 4 December 2019 в 11:04
поделиться
[11397721-

Хорошо, я признаю, что это ужасно, и там должен быть лучший способ, но это, кажется, работает.

/*/*[descendant::birthday and not(preceding-sibling::*[descendant::birthday])]

Я ищу все элементы на втором уровне в дереве, который имеет элемент потомка, называемый день рождения, который не имеет предыдущего элемента брата, который имеет элемент рождения в качестве потомка.

1
ответ дан 4 December 2019 в 11:04
поделиться

Попробуйте

//birthday[position()=1]

// находит узлы, независимо от того, где есть в иерархии

, вы могли бы также сделать

pet[position()=1]/data/birthday
-1
ответ дан 4 December 2019 в 11:04
поделиться

Проверили ли вы параметры UIViewAutoresizing?

(из документации)

UIViewAutoresizing
Specifies how a view is automatically resized.

enum {
   UIViewAutoresizingNone                 = 0,
   UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
   UIViewAutoresizingFlexibleWidth        = 1 << 1,
   UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
   UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
   UIViewAutoresizingFlexibleHeight       = 1 << 4,
   UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
typedef NSUInteger UIViewAutoresizing;
-121--2151645-

С учетом этой статьи существует стоимость, связанная с литьем.

Обратите внимание, что статья вышла в 1999 году, и читатель должен решить, заслуживает ли информация доверия!

-121--1307689-

К вашему сведению: можно визуализировать результаты различных запросов Xpath с помощью (свободного) инструмента XPathVisualizer . Работает только в Windows.

alt text

4
ответ дан 4 December 2019 в 11:04
поделиться
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <xsl:variable name="birthdays" select="//birthday"/>
        <xsl:value-of select="$birthdays[1]"/>
    </xsl:template>

</xsl:stylesheet>
0
ответ дан 4 December 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: