Подсчитать тег внутри другого тега с помощью XSLT 2.0 - PullRequest
1 голос
/ 27 февраля 2020

У меня есть XML файл, похожий на этот:

<tier_list>
  <tier>
    <status_list>
      <status>
        <b_list>
          <b>test1</b>
          <b>test2</b>
        </b_list>
      </status>
      <status>
        <b_list>
          <b>test3</b>
          <b>test4</b>
        </b_list>
      </status>
    <status_list>
   <tier>
  <tier>
    <status_list>
      <status>
        <b_list>
          <b>testest</b>
        </b_list>
      </status>
      <status>
        <b_list>
          <b>abc</b>
        </b_list>
      </status>
    <status_list>
   <tier>
</tier_list>

Я использую XSLT 2.0 для преобразования этого файла в файл CSV. Есть ли способ сгенерировать число, которое подсчитывает каждый b-тэг внутри tier-тэга (игнорируя тэг status)?

Чтобы я мог получить такой результат:

1;test1
2;test2
3;test3
4;test4
1;testtest
2;abc

1 Ответ

2 голосов
/ 27 февраля 2020

Самым простым решением, IMHO, является вложение двух xsl:for-each инструкций, чтобы счетчик перезапускался для каждого tier. Затем используйте функцию position() для обеспечения нумерации внутри внутреннего xsl:for-each:

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

<xsl:template match="tier_list">
    <xsl:for-each select="tier">
        <xsl:for-each select="status_list/status/b_list/b">
            <xsl:value-of select="position()"/>
            <xsl:text>;</xsl:text>  
            <xsl:value-of select="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

В качестве альтернативы вы можете использовать xsl:number:

<xsl:number level="any" from="tier" format="1;"/>

Демо (с использованием исправленной (!) версии вашего ввода): https://xsltfiddle.liberty-development.net/bFWRApq

...