проверка, является ли имя узла Fox в шаблоне P - PullRequest
2 голосов
/ 24 июня 2011

В имени шаблона P я хочу проверить, является ли имя текущего узла Fox.Мне интересно, как обычно люди делают такие проверки:

<xsl:template name="P">
    <xsl:if test="self::Fox">
    </xsl:if>
</xsl:template>

ИЛИ:

<xsl:template name="P">
    <xsl:if test="name(.)='Fox'">
    </xsl:if>
</xsl:template>

ИЛИ: есть еще лучший вариант?решение по сравнению с этим 2?

Ответы [ 3 ]

2 голосов
/ 24 июня 2011

Я думаю, вы обнаружите, что многие люди используют [name()='Fox'], но рекомендуемый способ, и способ, используемый экспертами, заключается в использовании self::Fox. Основная причина этого заключается в том, что name () ненадежна, когда вокруг существуют пространства имен, а альтернатива тестирования имен namespace-uri () и local-name () громоздка и многословна. Кроме того, многие движки XPath имеют способы поиска элемента с заданным именем, которые не требуют сравнения строк для каждого элемента. Поскольку оценка name () = Fox требует рассмотрения префикса пространства имен, а не URI, что является необычной операцией, это также, вероятно, будет менее эффективным.

1 голос
/ 24 июня 2011

Предпочтительным подходом является использование оси self, поскольку она позаботится о пространствах имен и будет более краткой.

Обратите внимание, однако, что если ваш текущий узел не узел элемента, ось self не будет работать так, как вы ожидаете. Например, в

<xsl:template match="processing-instruction()">
  <xsl:if test="self::workdir">
    ...
  </xsl:if>
</xsl:template>

Проверка никогда не будет успешной, даже если текущая инструкция обработки имеет имя workdir. То же самое относится и к более распространенному случаю

<xsl:template match="@*">
  <xsl:if test="self::href">
    ...
  </xsl:if>
</xsl:template>

Опять же, тест для атрибута href никогда не будет работать, так как тип узла принцип для оси self является элементом . В этом случае вы должны использовать name() или local-name()

<xsl:template match="@*">
  <xsl:if test="name() = 'href'">
    ...
  </xsl:if>
</xsl:template>
0 голосов
/ 24 июня 2011

Помимо того факта, что в первой проверке есть опечатка:

 <xsl:if test="self::Fox"/>

Вы также можете сравнить с именем узла независимо от его префикса пространства имен (если есть). В этом случае вы можете использовать local-name() вместо name().

О шаблоне XPath. Я не могу представить другие способы намного проще. Например, вы можете написать что-то вроде этого:

<xsl:if test="self::*[name()='test']">

Но это будет смешно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...