使用引用调用XSLT模板



这里是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>&#10;</xsl:text>
 <xsl:for-each select="//test[student_id=$id1]/name">
   <xsl:value-of select="."/>
   <xsl:text>&#10;</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)以避免这种情况。

相关内容

  • 没有找到相关文章

最新更新