#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:
Комментарии:
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>