xsl if и xsl foreach, где значение элемента - PullRequest
2 голосов
/ 12 сентября 2010

это мой xml:

<root>
 <a>
  <b>
   <t>1</t>
  </b>
  <b>
   <t>2</t>
  </b>
 </a>
</root>

Я хочу спросить: вот, скажите мне, существует ли t, но я хочу получить истинный ответ, если b exsit и у него t = 1

танки

Ответы [ 2 ]

1 голос
/ 13 сентября 2010

Использование :

boolean(/*/*/b[t=1])

При оценке по предоставленному документу XML результат:

true()

Помните : Всегда старайтесь избегать аббревиатуры // , поскольку это приводит к крайне неэффективному обходу всего (под) дерева с корнем в узле контекста.

1 голос
/ 12 сентября 2010

Тест, который вы ищете -

//b/t[text() = '1']

Этот тест теперь можно использовать в template в качестве совпадения, в for-each цикле в качестве селектора или в if в качестве теста - например ::

<xsl:template match="//b/t[text() = '1']">
    <!-- all t children of b with a content of 1 -->
</xsl:template>

<xsl:for-each select="//b/t[text() = '1']">
    <!-- all t children of b with a content of 1 -->
</xsl:for-each>

<xsl:if test="//b/t[text() = '1']">
    <!-- This is the true case -->
</xsl:if>

Примечание:

  • Этот пост основан на предположении, что вы запрашиваете с корневого уровня и не знаете, где комбинация b / t . Если вы запрашиваете точку в иерархии или знаете точный путь к комбинации b / t, вам может потребоваться , с до заменить // на что-то более подходящее , чтобы избежать неэффективности .
  • Также обратите внимание, что функция text() объединяет текстовое содержимое всех узлов-потомков, т. Е. Используйте его только вышеописанным способом, если можете быть уверены, что потомков больше нет. Тест узла text () возвращает все текстовые узлы под узлом контекста. (Мартин, спасибо, что указал на это).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...