根据底层属性获取上层标签值

Get Upper tag value depending on low level attributes

我对 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、... 语言:汉斯语、Fiola 语、Béatrice 语、...

我之前也有类似的结果,但是我改的太多了,我不能再访问旧版本了。但我有类似的东西: 科学:彼得 科学:杰弗里 政治:薇薇安 政治:莎拉

这就是我所说的 "repetitve" 的意思。我无法列出模块后面的所有学生。

这是我当前的 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>

I want to extract all names of students who, for example, study science so the output would like this: Science: Peter, Will, Jeffrey

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

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>