Как считать узлы в XSLT? - PullRequest
       1

Как считать узлы в XSLT?

3 голосов
/ 31 января 2011

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

Прежде всего, я не считаю узлы из исходного XML-документа, я собираюсь подсчитать некоторые узлы из полученного XML (исходный XML-документ может быть пустым).

Во-вторых, я не считаю все узлы.

Например, вот фрагмент моего кода XSLT:

<xsl:template name="Loop2000A">
  <Loop2000A>
<HL>
  <HL01>
    <xsl:value-of select="'1'"/>
  </HL01>
  <HL03>
    <xsl:value-of select="'20'"/>
  </HL03>
</HL>
 <xsl:if test="$recbat//provider_taxonomy_qual !='' ">
<PRV>
 <PRV01>
   <xsl:value-of select="'BI'"/>
 </PRV01>
     <PRV02>
   <xsl:value-of select="$recbat//provider_taxonomy_qual"/>
 </PRV02>
<PRV03>
   <xsl:value-of select="$recbat//provider_taxonomy"/>
</PRV03>
   </PRV>
  </xsl:if>
<xsl:call-template name="Loop2010AA"/>

Так что для этого кода и называются сегменты, а эти $ recbat и т. Д. Являются источниками данных.Поэтому хочу, чтобы я действительно хотел посчитать количество этих сегментов, и это может быть в разных шаблонах (например, шаблон «Loop2010AA» выше, который является другим шаблоном), и эти сегменты могут иметь циклы, поэтому они могут создаваться 3 раза подряд,который наш счетчик должен увеличить на 3 соответственно, или, может быть, оператор «если» не выполнен, таким образом, такой сегмент не создается, тогда счетчик должен остаться прежним.

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

В качестве альтернативы, я думаю о более прямом способе сделать это.Вместо использования переменной счетчика, есть ли какой-нибудь способ, которым я могу сначала сгенерировать выходной xml-документ, затем я подсчитываю нужные мне узлы в этом xml и затем генерирую TRUE-вывод с числом в нем.

1 Ответ

3 голосов
/ 31 января 2011

Вот общий способ обработки результата преобразования, включая подсчет его узлов :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 >
 <xsl:output method="text"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/">
  <xsl:variable name="vrtfPass1">
   <top>
    <xsl:apply-templates select="*"/>
    <xsl:apply-templates select="*"/>
   </top>
  </xsl:variable>

  <xsl:variable name="vPass2" select="ext:node-set($vrtfPass1)"/>

  <xsl:value-of select="count($vPass2/*/*/*)"/>
 </xsl:template>
</xsl:stylesheet>

, когда это преобразование применяется к следующему документу XML :

<nums>
 <num>1</num>
 <num>2</num>
 <num>3</num>
 <num>4</num>
 <num>5</num>
</nums>

получен правильный результат :

10

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

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