В чем разница между ['#']
и [.='#']
? Есть ли вообще разница?В чем разница между ['#'] и [. = '#']?
В частности, следующие выражения:
<xsl:template match="a/@href[.='#']">...</xsl:template>
<xsl:template match="a/@href['#']">...</xsl:template>
В чем разница между ['#']
и [.='#']
? Есть ли вообще разница?В чем разница между ['#'] и [. = '#']?
В частности, следующие выражения:
<xsl:template match="a/@href[.='#']">...</xsl:template>
<xsl:template match="a/@href['#']">...</xsl:template>
Предикат фильтрует, если содержащиеся выражение не верно. [.='#']
проверяет, соответствует ли содержание строки текущего контекста (.
) #
, поэтому первый шаблон будет возвращать все атрибуты @href
для ссылок, например <a href="#">...</a>
.
Второй шаблон не содержит логического оператора, и он также не является числовым (поэтому это будет позиционный тест). Это будет оцениваться как дано boolean
функции:
Функция:
boolean boolean(object)
Булева функция преобразует свой аргумент в булево следующим образом:
- число истинно, если и только если он не является ни положительным, ни отрицательным. ноль или NaN
- набор узлов является истинным тогда и только тогда, когда он не пуст
- строки истинно тогда и только тогда, когда его длина не равна нуль
- объект типа, кроме четырех основных типов преобразуются в логическое значение таким образом, что зависит от того типа
Здесь у нас есть непустая строка с эффективным логическим значением true
, поэтому предикат во втором шаблоне никогда не будет фильтровать что-либо.
Предикат как в //a[@href]
с другой стороны, фильтр будет для всех ссылок, содержащих @href
атрибута (здесь, мы фильтруем для набора узлов).
Таким образом, первый запрос будет возвращать все атрибуты @href для таких ссылок, как '.. Это, по крайней мере, неверно для XPath 1.0 .. http://3v4l.org/39iRA – hek2mgl
Вы опустили'/@ href' в выражение XPath. Если вы добавите его, чтобы он напоминал запрос из вопроса, он точно выполнит то, что я описал в ответе. –
Позор мне, я пропустил это. Очень хороший ответ! – hek2mgl