Как прочитать все внутренние рекурсивные значения из XML с помощью XSLT

#xml #xslt #xslt-1.0 #wso2esb #xslt-grouping

#xml — файл #в XSLT #xslt-1.0 #xslt-группировка #wso2-esb #xslt

Вопрос:

необходимо извлечь значения со всех уровней рекурсивной структуры XML.Структура на всех уровнях одинакова

 <regPackagingHierarchyList>
  <RegistrationPackagingHierarchy>
    <recordId>Level0</recordId>
    <regParentPackagingHierarchy>
      <RegistrationPackagingHierarchy>
        <recordId>level5</recordId>
        <regParentPackagingHierarchy>
          <RegistrationPackagingHierarchy>
            <recordId>level4</recordId>
            <regParentPackagingHierarchy>
              <RegistrationPackagingHierarchy>
                <recordId>level3</recordId>
                <regParentPackagingHierarchy>
                  <RegistrationPackagingHierarchy>
                    <recordId>level2</recordId>
                    <regParentPackagingHierarchy>
                      <RegistrationPackagingHierarchy>
                        <recordId>level1</recordId>
                      </RegistrationPackagingHierarchy>
                    </regParentPackagingHierarchy>
                  </RegistrationPackagingHierarchy>
                </regParentPackagingHierarchy>
              </RegistrationPackagingHierarchy>
            </regParentPackagingHierarchy>
          </RegistrationPackagingHierarchy>
        </regParentPackagingHierarchy>
      </RegistrationPackagingHierarchy>
    </regParentPackagingHierarchy>
  </RegistrationPackagingHierarchy>
</regPackagingHierarchyList>
  

Ожидаемый результат должен быть в следующем формате
Уровень 1, Уровень 2, Уровень 3, уровень 4, Уровень 5

Комментарии:

1. Могли бы вы иметь два RegistrationPackagingHierarchy элемента, которые были братьями и сестрами друг друга, или будет только один RegistrationPackagingHierarchy дочерний элемент для каждого родителя?

2. Это всегда будет один дочерний элемент @TimC

Ответ №1:

Одним из способов в 1.0 может быть:

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" />

<xsl:template match="/">
    <xsl:for-each select="//regParentPackagingHierarchy//recordId">
        <xsl:sort select="position()" order="descending" />
        <xsl:value-of select="." />
        <xsl:if test="position() != last()">
            <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
  

http://xsltfiddle .liberty-development.net/pPzifpv

Редактировать:

 <xsl:value-of select="concat('Count(regPackagingHierarchyList) = ', count(//regPackagingHierarchyList))"/>
<xsl:value-of select="concat('Count(RegistrationPackagingHierarchy) = ', count(//RegistrationPackagingHierarchy))"/>
  

Редактировать 2:

http://xsltfiddle .liberty-development.net/pPzifpv/8

Комментарии:

1. Большое вам спасибо.. это работает так, как ожидалось @Vebbie

2. Как считать дочерние узлы для <RegistrationPackagingHierarchy> или <regPackagingHierarchyList> . ожидаемый результат — Count(regPackagingHierarchyList)=17

3. @DhanaSekhar : Добавил это в ответ.

4. @Vibbie, возникла еще одна проблема. <regPackagingHierarchyList> этот тег повторяется, и при запуске вашего XSLT я объединяю все вместе. например, level1, level2,level3,level4,level5level1,level2,level3,level4,level5 . не могли бы вы, пожалуйста, помочь мне исправить это. Ожидается, что на первой итерации я должен получить итерацию-1::level1, level2, level3, level4, level5 Итерация2:level1, level2, level3, level4, level5 буду ждать вашего ответа. обновлено здесь по ссылке

5. вот как будет выглядеть структура XML <regPackagingHierarchyList> <RegistrationPackagingHierarchy>СПИСОК родительских пакетов</RegistrationPackagingHierarchy> <RegistrationPackagingHierarchy>СПИСОК родительских пакетов</RegistrationPackagingHierarchy> <RegistrationPackagingHierarchy>СПИСОК родительских пакетов</RegistrationPackagingHierarchy> </RegistrationPackagingHierarchy Regpackaging Иерархический список>

Ответ №2:

 <xsl:template match="*">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="recordId">
    <xsl:apply-templates/> 
    <!-- Apply all the templates beneath first and output your id after they got applied. -->
    <xsl:if test="ancestor::regParentPackagingHierarchy">
        <xsl:value-of select="."/>
    </xsl:if>
</xsl:template>