Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt XSL:如何选择列表中满足特定条件的前两个节点_Xslt - Fatal编程技术网

Xslt XSL:如何选择列表中满足特定条件的前两个节点

Xslt XSL:如何选择列表中满足特定条件的前两个节点,xslt,Xslt,如果我有如下类似的XML(学生按分数排序) 乔 大一新生 10 山姆 级别高的 7. 玛丽 大一新生 4. 安 年少者 2. 我如何使用XSL来选择前两个不是大一学生的学生,最终得到如下结果 来自原始帖子的澄清-这是一个简化的转换示例,我正试图在将其转发给第三方之前在ESB上进行转换。第三方要求消息具有不同的标记,如name1和name2 <students> <name1>Sam</name1> <name2>Ann</

如果我有如下类似的XML(学生按分数排序)


乔
大一新生
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() &lt;= 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() &lt;= 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>