我对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>
答案 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> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>