Подсчитать количество элементов, возвращаемых - PullRequest
5 голосов
/ 16 ноября 2010

У меня есть следующая таблица стилей xsl:

<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="utf-8"/>

  <xsl:template match="/">
    <xsl:variable name="elements">
      <xsl:call-template name="get-some-nodes"/>
    </xsl:variable>

    <root>
      <values>
        <xsl:copy-of select="$elements"/>
      </values>
      <count>
        <xsl:value-of select="count($elements)"/>
      </count>
    </root>
  </xsl:template>

  <xsl:template name="get-some-nodes">
    <node>1</node>
    <node>2</node>
    <node>3</node>
  </xsl:template>

</xsl:stylesheet>

(не имеет значения, к какому xml вы применяете его, он генерирует свои собственные данные).

Результат этого (с использованием xsltproc):

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.w3.org/1999/xhtml" xmlns:set="http://exslt.org/sets">
  <values>
    <node>1</node>
    <node>2</node>
    <node>3</node>
  </values>
  <count>1</count>
</root>

Учитывая, что вызываемый шаблон возвращает три узла, я ожидал, что "count ($ elements)" будет равен 3, но это один. Я подозревал, что, возможно, результаты были обернуты в какой-то корневой узел, но любая попытка сделать подсчет ($ elements / *) или подобное не удалась, я считаю, что $ elements - это фрагмент дерева результатов, а не набор узлов.

У меня нет доступа ни к одной из вкусностей exslt или xslt2.0, наверняка есть способ получить количество узлов, хранящихся в переменной?

Я также был бы рад подсчитать количество узлов, возвращаемых шаблоном вызова, без использования промежуточной переменной, но я не понимаю, как это возможно.

1 Ответ

3 голосов
/ 16 ноября 2010
<xsl:variable name="elements"> 
  <xsl:call-template name="get-some-nodes"/> 
</xsl:variable> 

<root> 
  <values> 
    <xsl:copy-of select="$elements"/> 
  </values> 
  <count> 
    <xsl:value-of select="count($elements)"/> 
  </count> 
</root>

В XSLT 1.0, всякий раз, когда узлы копируются в тело <xsl:variable>, содержимое этой переменной является RTF (Result-Tree_fragment) и требуетбыть преобразованным в обычное дерево перед дальнейшей обработкой с помощью XPath.

RTF можно преобразовать в обычное дерево только с помощью функции расширения, обычно называемой xxx:node-set(), где префикс xxx привязан к пространству имен конкретного поставщика.

Для полученияколичество элементов, которые находятся на верхнем уровне этого дерева, вам нужно:

count(xxx:node-set($elements)/*)

Вот некоторые пространства имен, к которым xxx: часто привязан :

"http://exslt.org/common/"

"urn:schemas-microsoft-com:xslt"

В XSLT 2.0 «тип» RTF больше не существует, и вы можете просто иметь :

count($elements/*)

, если тип $elements не указан (по умолчанию document-node())

или

count($elements)

, если тип $elements указан как element()*

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