Как прочитать все внутренние рекурсивные значения из XML с использованием XSLT - PullRequest
1 голос
/ 04 апреля 2019

необходимо извлечь значения из всех уровней рекурсивной структуры 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>

Ожидаемый результат должен быть в следующем формате Level1, Level2, Level3, level4, Level5

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Один путь в 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

Edit:

<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

0 голосов
/ 04 апреля 2019
<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>
...