считая, сколько раз что-то появляется в другой части XML-документа - PullRequest
2 голосов
/ 10 января 2011

Допустим, у меня есть XML-файл, подобный этому:

<root>
 <a><b><c> w </c></b></a>
 <x><y><z> w </z></y></x>
 <x><y><z> w </z></y></x>

и строка xsl, подобная этой:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
     <xsl:value-of select="count( ./a/b[c = ./x/y/z] )"/>
  </xsl:template>
</xsl:stylesheet>

И результат равен 0 (хочу, чтобы оно было 2:)

Это просто упрощенный пример того, что я пытаюсь сделать.По сути, я хочу посчитать, сколько раз материал из «a / b / c» появляется в какой-то другой части документа, и, как вы можете видеть, я делаю что-то не так

Ответы [ 2 ]

2 голосов
/ 10 января 2011

Используйте

/*/x/y/z[. = current()/a/b/c]

Это означает :

Выбрать все элементы /*/x/y/z, строковое значение которых равно строковому значению (одного из) элементов current()/a/b/c.

Обратите внимание , что стандартная функция XSLT current() вычисляет текущий узел (тот, для которого был выбран шаблон, или тот, который на к которому применяется тело <xsl:for-each>.

1 голос
/ 10 января 2011

Я знаком с XSLT 1.0; но я вижу здесь две вещи:

  • Вы считаете "c", которые соответствуют некоторому критерию; но есть только один c - вы хотите считать "z" s.
  • Вы оцениваете ./x/y/z/ в контексте b , а не в контексте root - так что xpath не делает то, что вы ожидаете.

В XSLT 1.0 (и, вероятно, без особых сложностей в 2.0, тогда):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
     <xsl:variable name="self" select="."/>
     <xsl:value-of select="count(x/y/z[. = $self/a/b/c] )"/>
  </xsl:template>
</xsl:stylesheet>

В вашем реальном коде, вероятно, было бы яснее не определять переменную, указывающую на /root, а хранить строку, которую вы ищете напрямую: <xsl:variable name="val" select="a/b/c"/>; в любом случае может работать.

...