Объединение узлов из разных уровней в единый список в XSLT 2.0 - PullRequest
0 голосов
/ 08 мая 2018

Что я пытаюсь сделать, это взять определенный узел, в примере <person>, и объединить его в список всех доступных узлов человека. Вот мой пример источника:

   <group groupName="The Little Rascals">
      <peopleInGroup>
            <people>
               <person>
                  <name value="John Doe">
                  <birthdate value="01/01/1953">
               </person>
               <person>
                  <name value="John Doe 2">
                  <birthdate value="01/01/1953">
               </person>
               <childrenInGroup>
                  <person>
                      <name value="Jane">
                      <birthdate value="01/01/1973">
                  </person>
                  <person>
                      <name value="Suzie">
                      <birthdate value="01/01/1970">
                  </person>
                </childrenInGroup>
             </people>
         </peopleInGroup>
      </group>

В этом случае я хочу получить список всех элементов <person> независимо от уровня и зациклить каждый из них. Список будет выглядеть примерно так:

               <person>
                  <name value="John Doe">
                  <birthdate value="01/01/1953">
               </person>
               <person>
                  <name value="John Doe 2">
                  <birthdate value="01/01/1953">
               </person>
               <person>
                   <name value="Jane">
                   <birthdate value="01/01/1973">
               </person>
               <person>
                   <name value="Suzie">
                   <birthdate value="01/01/1970">
               </person>

Единственная сортировка, которую я хотел бы сделать в этом случае, может быть по Дню Рождения. Я думал, что это что-то вроде Deep Copy узла <person>, но я не знаю, как будет выглядеть его реализация.

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

<xsl:for-each select="$persons">
   <xsl:value-of select="@name"/>
   <xsl:value-of select="@birthday"/>
</xsl:for-each>

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
<xsl:template match="group">
        <xsl:for-each select="peopleInGroup/people/person|peopleInGroup/people/childrenInGroup/person">

                <xsl:copy-of select="."/>

        </xsl:for-each>

    </xsl:template> 

Вы можете использовать xsl: for-each, а затем копировать person.

0 голосов
/ 08 мая 2018

Помимо сортировки, вы можете просто использовать XPath с //person для выбора всех person элементов в виде последовательности.

Если вы хотите отсортировать их, вы можете использовать xsl:perform-sort:

  <xsl:variable name="sorted-persons" as="element(person)*">
      <xsl:perform-sort select="descendant::person">
          <xsl:sort select="xs:date(replace(birthdate/@value, '([0-9]{2})/([0-9]{2})/([0-9]{4})', '$3-$2-$1'))"/>
      </xsl:perform-sort>
  </xsl:variable> 

Затем вы можете использовать эту отсортированную последовательность для каждого, если хотите, или напрямую выводить данные, используя value-of: https://xsltfiddle.liberty -development.net / 94hvTyZ

...