这里是XSLT的基本问题,我需要帮助来获得一个干净的解决方案。
我的XML
<class_list>
<students>
<student>
<id>1</id>
<name>Aimee</name>
</student>
<student>
<id>2</id>
<name>Anna</name>
</student>
<students>
<tests>
<test>
<name>mathematics test 1</name>
<student_id>1</id>
<grade>A+</grade>
</test>
<test>
<name>mathematics test 1</name>
<student_id>1</id>
<grade>B+</grade>
</test>
<test>
<name>mathematics test 2</name>
<student_id>1</id>
<grade>B+</grade>
</test>
<test>
<name>mathematics test 2</name>
<student_id>2</id>
<grade>B+</grade>
</test>
<test>
<name>mathematics test 3</name>
<student_id>1</id>
<grade>B+</grade>
</test>
<tests>
</class_list>
我喜欢跟踪结果
Aimee
数学测试1
数学测试3
Anna
数学测试1
数学测试2
这是我的XSL
<xsl:template match="students">
<xsl:apply-templates select="student"/>
</xsl:template>
<xsl:template match="student">
<xsl:value-of select="name"/>
<xsl:apply-templates select="/class_list/tests"/>
</xsl:template>
<xsl:template match="tests">
<xsl:value-of select="test[student_id=?id" />
</xsl:template>
<xsl:template match="test">
<xsl:value-of select="name" />
</xsl:template>
我的问题是我如何通过或过滤"测试"与学生id[?id]
感谢
罗马
您已经有了使用方括号进行筛选的想法,但它不适合用于"值",请在"应用模板"上使用它,如下所示:
<xsl:template match="student">
<xsl:value-of select="name"/>
<xsl:apply-templates select="/class_list/tests[student_id='1']"/>
</xsl:template>
如果你想过滤当前学生,你可以使用一个变量来避免混淆数据:
<xsl:template match="student">
<xsl:variable name="stud_id" select="id"/>
<xsl:value-of select="name"/>
<xsl:apply-templates select="/class_list/tests[student_id=$stud_id]"/>
</xsl:template>
我还没有测试过,但应该可以
编辑只是为了完整:您也可以在"模板匹配"上使用方括号进行筛选
编辑@Ian Roberts:好主意,我不知道current()
假设输入正确,请使用以下样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="students">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="student">
<xsl:variable name="id1" select="id"/>
<xsl:value-of select="name"/>
<xsl:text> </xsl:text>
<xsl:for-each select="//test[student_id=$id1]/name">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template match="test"/>
</xsl:stylesheet>
这是我得到的输出:
Aimee
mathematics test 1
mathematics test 1
mathematics test 2
mathematics test 3
Anna
mathematics test 2
请注意,您显示的输入XML不是有效的XML。确保所有元素都正确关闭(例如students
元素)。此外,student_id
元素必须使用相同的标签(即,不是id
)关闭。
我建议您对照XML解析器或验证器检查XML(和XSLT)以避免这种情况。