Xslt XSL:如何选择列表中满足特定条件的前两个节点
如果我有如下类似的XML(学生按分数排序)Xslt XSL:如何选择列表中满足特定条件的前两个节点,xslt,Xslt,如果我有如下类似的XML(学生按分数排序) 乔 大一新生 10 山姆 级别高的 7. 玛丽 大一新生 4. 安 年少者 2. 我如何使用XSL来选择前两个不是大一学生的学生,最终得到如下结果 来自原始帖子的澄清-这是一个简化的转换示例,我正试图在将其转发给第三方之前在ESB上进行转换。第三方要求消息具有不同的标记,如name1和name2 <students> <name1>Sam</name1> <name2>Ann</
乔
大一新生
10
山姆
级别高的
7.
玛丽
大一新生
4.
安
年少者
2.
我如何使用XSL来选择前两个不是大一学生的学生,最终得到如下结果
来自原始帖子的澄清-这是一个简化的转换示例,我正试图在将其转发给第三方之前在ESB上进行转换。第三方要求消息具有不同的标记,如name1和name2
<students>
<name1>Sam</name1>
<name2>Ann</name2>
</students>
山姆
安
我目前有以下XSL,但它显然没有过滤掉新生:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="students/student[1]">
<xsl:element name="name1">
<xsl:value-of select="name" />
</xsl:element>
</xsl:template>
<xsl:template match="students/student[2]">
<xsl:element name="name2">
<xsl:value-of select="name" />
</xsl:element>
</xsl:template>
<xsl:template match="students/student[position() > 2]" />
</xsl:stylesheet>
谢谢。简单点怎么样:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
<xsl:template match="/students">
<xsl:copy>
<xsl:apply-templates select="student[year != 'Freshman']"/>
</xsl:copy>
</xsl:template>
<xsl:template match="student">
<xsl:if test="position() <= 2">
<xsl:copy-of select="name"/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
注意:使用您的示例,这将返回:
<students>
<name>Sam</name>
<name>Ann</name>
</students>
山姆
安
嗯,你真的不希望每个学生都有一个不同的元素名
编辑: 第三方要求消息具有以下内容
和
-
嗯,我想他们会后悔得到他们想要的。不管怎样,你可以按照丹尼尔·海利的方式来做,或者:
...
<xsl:template match="student">
<xsl:if test="position() <= 2">
<xsl:element name="{concat('student', position())}">
<xsl:copy-of select="name"/>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
。。。
如果您想包括关于这两名学生的更多详细信息,无论是现在还是将来。类似于user3016153的答案,但将数字添加到
name
元素中
XSLT2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="students">
<xsl:copy>
<xsl:apply-templates select="student[not(year='Freshman')]/name"/>
</xsl:copy>
</xsl:template>
<xsl:template match="name">
<xsl:element name="name{position()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XML输出
<students>
<name1>Sam</name1>
<name2>Ann</name2>
</students>
山姆
安
另外,我使用了
not(year='Freshman')
而不是year!='新生
。这将包括根本没有年份
元素的学生。如果你不想把这些学生包括在内,请使用=代码>而不是not()
谢谢。这确实有帮助。然而,我确实需要它是和。对不起,我从一开始就没提这个。这是一个简化的转换示例,我正在尝试在将ESB转发给第三方之前在ESB上进行转换。是第三方要求消息具有类似和的内容。您还可以通过将xsl:apply templates上的选择更改为student[year!=“Freshman']/name
并将match=“student”模板更改为
@user3124095来简化(有些勉强)在我的答案中添加了一个变体。@DanielHaley我没有这样做,因为我怀疑它不仅仅以名字结尾。谢谢你的回答。我能够用它们来解决我的问题。
<students>
<name1>Sam</name1>
<name2>Ann</name2>
</students>