获取Upper标记值取决于低级别属性

时间:2016-06-07 10:11:49

标签: xslt parallel.foreach

我对XSL很新,并考虑用XSL转换xml文件的问题。 我的xml看起来像这样:

  <studentlist>
    <student name="Peter">
    <sem name="5>
    <mod name="science"/>
    </sem>
    </student> 
    ...
    ...
    </studentlist>

此学生列表中有更多学生,我想提取所有学生的名字,例如,学习科学,所以输出结果如下: 科学:彼得,威尔,杰弗里

我正在使用一个匹配“studentlist / student / sem / mod”的模板。 我可以使用这个匹配器提取每个模块,但问题是: 1.仍然会显示重复匹配,这是我想避免的 2.从那时起我无法达到学生姓名,即使我不知道如何创建我的成绩列表。

我尝试使用内部for-each来解决这个问题,但绝对路径和相对路径似乎都在这里解决。

有人可以帮我或者给我一个提示如何实现这个,实际上很简单的问题,使用XSL?

编辑:我的xml结构未显示。我稍后会在电脑上编辑它。

编辑:我正在使用XSLT 2.0。问题是,我有更多的模块,不仅仅是科学(但xml中的结构保持不变)。例如。有政治,语言等等。所以我想要做的是在列表中显示所有学生依赖于模块。我想要的输出看起来像: 科学:彼得,杰弗里,...... 政治:Vivien,Sarah,Antonio,...... 语言:Hans,Fiola,Béatrice,......

我之前有过类似的结果,但是我改变了太多,我再也无法达到旧版本了。但我有类似的东西: 科学:彼得 科学:杰弗里 政治:费雯丽 政治:莎拉

这就是我所说的“重复”。我没有能力列出模块背后的所有学生。

这是我目前的XSL,虽然没有工作..

<xsl:template match="studentlist/student/sem/mod">
<xsl:for-each select="./name">
    <xsl:variable name="currName" select="name"/>
    <xsl:for-each select="studentlist/student/sem/mod@name">
        <xsl:if test="$currName = $name">
            <xsl:text>$currName = $name</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:for-each>

1 个答案:

答案 0 :(得分:0)

  

我想提取所有学生的名字,例如学习   科学所以输出会是这样的:科学:彼得,威尔,杰弗里

显然,你想按学科对学生进行分组 - 那你为什么不这样做呢?

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:template match="/studentlist">
    <xsl:for-each-group select="student" group-by="sem/mod/@name">
        <xsl:value-of select="current-grouping-key()" />
        <xsl:text>: </xsl:text>
        <xsl:value-of select="current-group()/@name" separator=", "/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>