我要做的是在示例<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>
感谢您的帮助!
答案 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