Тест XPath для определения типа узла - PullRequest
5 голосов
/ 29 июня 2011

Я не понимаю, почему этот тест

count(.|../@*)=count(../@*) 

(из Домашняя страница Дэйва Поусона )

определить узел атрибута: (

Может ли кто-нибудь дать мне подробное объяснение?

Ответы [ 3 ]

7 голосов
/ 29 июня 2011

Несколько вещей, чтобы понять:

  1. . относится к текущему узлу (он же «контекстный узел»)
  2. узел атрибута имеет родителя (элемент, которому он принадлежит)
  3. операция объединения XPath (с |) никогда не дублирует узлы, т.е. (.|.) приводит к одному узлу, а не двум
  4. есть ось self::, которую вы можете использовать в теории (например, self::* работает, чтобы определить, является ли узел элементом), но self::@* не работает, поэтому мы должны использовать что-то другое

Зная это, вы можете сказать:

  • ../@* извлекает все атрибуты родительского узла текущего узла (если хотите, все "атрибуты родного элемента")
  • (.|../@*) объединяет текущий узел с ними - если текущий узел является атрибутом, общее количество не изменяется (согласно пункту 3 выше)
  • поэтому, если count(.|../@*) равно count(../@*), текущий узел должен быть узлом атрибута .
2 голосов
/ 29 июня 2011

Просто для полноты, в XSLT 2.0 вы можете сделать

<xsl:if test="self::attribute()">...</xsl:if>
1 голос
/ 29 июня 2011

Вот как это работает

count(      # Count the nodes in this set
.|../@*)    # include self and all attributes of the parent
            # this counts all of the distinct nodes returned by the expression
            # if the current node is an attribute, then it returns the count of all the
            # attributes on the parent element because it does not count the current 
            # node twice. If it is another type of node it will return 1 because only
            # elements have attribute children

=count(     # count all the nodes in this set
../@*)      # include all attribute nodes of the parent. If the current node is not an
            # attribute node this returns 0 because the parent can't have attribute
            # children
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...