根据底层属性获取上层标签值
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> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
我对 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> </xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>