将来自不同级别的节点组合到XSLT 2.0中的单个列表中

时间:2018-05-08 18:15:44

标签: xslt grouping xslt-2.0

我要做的是在示例<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>

在这种情况下我想要做的唯一排序可能是生日。我在想像<person>节点的深层副本,但我不知道它的实现是什么样的。

创建列表后,想法就是在for-each中循环遍历列表:

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

除了排序之外,您只需使用带有//person的XPath将所有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> 

然后,您可以根据需要在for-each中使用该排序序列,或使用value-of直接输出数据:https://xsltfiddle.liberty-development.net/94hvTyZ