Xml 按相同的条件对不同的元素进行排序
我试图对以下数据进行排序Xml 按相同的条件对不同的元素进行排序,xml,xslt,Xml,Xslt,我试图对以下数据进行排序 <contents> <content> <id> <text> </content> <relatedcontent> <id> <text> </relatedcontent> </contents> 这只是简单的示例数据,但您可以理解。它的两个不同的命名节点包含相同的结
<contents>
<content>
<id>
<text>
</content>
<relatedcontent>
<id>
<text>
</relatedcontent>
</contents>
这只是简单的示例数据,但您可以理解。它的两个不同的命名节点包含相同的结构。
现在,我已经创建了两个不同的模板,分别处理内容和相关内容,但排序也分别完成。有没有一种简单的方法可以在ids上对内容和相关内容进行排序?假设
包含一个文本。然后,我如何列出按id排序的内容和相关内容的所有
-元素
谢谢 试试这样的东西
<xsl:foreach select="//content | //relatedcontent">
<xsl:sort select="id" />
<xsl:value-of select="text" />
</xsl:foreach>
我猜解决方案在于您使用union操作符将
//content
和//relatedcontent
连接到单个节点集中
此转换显示了如何完成此操作:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<contents>
<xsl:apply-templates>
<xsl:sort select="id" data-type="number"/>
</xsl:apply-templates>
</contents>
</xsl:template>
<xsl:template match="content">
Content Here
</xsl:template>
<xsl:template match="relatedcontent">
Relatedcontent Here
</xsl:template>
</xsl:stylesheet>
<contents>
Relatedcontent Here
Content Here
</contents>
满足于此
相关内容在这里
应用于提供的XML文档时(更正为格式正确):
3.
2.
生成所需的正确排序结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<contents>
<xsl:apply-templates>
<xsl:sort select="id" data-type="number"/>
</xsl:apply-templates>
</contents>
</xsl:template>
<xsl:template match="content">
Content Here
</xsl:template>
<xsl:template match="relatedcontent">
Relatedcontent Here
</xsl:template>
</xsl:stylesheet>
<contents>
Relatedcontent Here
Content Here
</contents>
相关内容在这里
满足于此
注意事项:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<contents>
<xsl:apply-templates>
<xsl:sort select="id" data-type="number"/>
</xsl:apply-templates>
</contents>
</xsl:template>
<xsl:template match="content">
Content Here
</xsl:template>
<xsl:template match="relatedcontent">
Relatedcontent Here
</xsl:template>
</xsl:stylesheet>
<contents>
Relatedcontent Here
Content Here
</contents>
。仅使用
id
排序的元素,则此转换仍将有效,而不会发生任何更改谢谢我不是在使用foreach,我是在模板中使用它,但这也很好用!当模式已知时,使用带有起始
/
运算符的路径是不好的。@Alejandro:因为我对模式不太了解,所以我做了一个简单的示例。我认为就答案而言,这已经足够好了。+1是为了在一个更大的模板中简单易用。好问题,+1。有关更简单、更符合XSLT精神、更通用、更灵活的解决方案,请参见我的答案。:)从技术上说你是对的。但是我想XSL初学者在大多数情况下更容易使用
。@Lucas Eder:对于某些类型的初学者来说,使用
可能会更容易。然而,教初学者使用
,而不向他展示
更强大、更通用——这显然是错误的。更不用说还有其他类型的初学者之前没有编程经验,这些人通常学习
最自然。更不用说OP自己提到他没有使用
呵呵“完全错误”。。。我喜欢这样。这部连环漫画里的是你吗?;-)说真的,快速浏览一下我们的大型web应用程序(60万用户,随时有2000多个并发会话)就会发现,大约有1263个循环。我想我们是你认为某种类型的初学者…但是在那里。感谢您的“通用”答案。@Lukas Eder:应用程序的大小通常与其开发人员的XSLT经验无关。我见过很多具有“初学者”XSLT质量的大型应用程序,因此您的事实并不令人惊讶。由于这些事实,我们更有义务向人们解释XSLT到底是什么。至于XKCD动画片,是的,这是一部很好的动画片,我已经知道很长时间了。不,我不是照片中的那个家伙,我不会告诉你怎么种萝卜。我不是一个“无所不知”的人,只是擅长一些事情,其他什么都不擅长。我可以接受。没有关于他们的噩梦1263对每个人来说…:-)