XSL [初学者] 如何在 table 中使用不同实体的属性

XSL [Beginner] How to use different entities' attribute in a table

我以前从未编码过,所以这可能是一个糟糕的问题,但我正在努力设计我想要的代码: 这是我的一些数据(XML 文档):

<Exam>
      <id>98</id>
      <ExamName>Mathematics</ExamName>
      <ExamGrade>6</ExamGrade>
    </Exam>
    <Exam>
      <id>99</id>
      <ExamName>Mathematics</ExamName>
      <ExamGrade>6</ExamGrade>
    </Exam>
    <Exam>
      <id>100</id>
      <ExamName>Data Management</ExamName>
      <ExamGrade>6</ExamGrade>
    </Exam>
  </Exams>

  <Schools>
    <School>
      <Ranking>1</Ranking>
      <MinimumRequired>6</MinimumRequired>
      <SchoolName>Hardvard</SchoolName>
    </School>
    <School>
      <Ranking>2</Ranking>
      <MinimumRequired>5.7</MinimumRequired>
      <SchoolName>ETH Zurich</SchoolName>
    </School>
    <School>
      <Ranking>3</Ranking>
      <MinimumRequired>5.5</MinimumRequired>
      <SchoolName>SAS's School</SchoolName>
    </School>
    <School>
      <Ranking>4</Ranking>
      <MinimumRequired>5.2</MinimumRequired>
      <SchoolName>Zhaw</SchoolName>
    </School>
  </Schools>

  <Students>
    <Student>
      <id>1</id>
      <Name>Brion</Name>
      <National>National</National>
      <DataManagementGrade>5.2</DataManagementGrade>
    </Student>
    <Student>
      <id>2</id>
      <Name>Niels</Name>
      <National>National</National>
      <DataManagementGrade>4.4</DataManagementGrade>
    </Student>
    <Student>
      <id>3</id>
      <Name>Lukas</Name>
      <National>International</National>
      <DataManagementGrade>4.3</DataManagementGrade>
    </Student>
    <Student>
      <id>4</id>
      <Name>Adelheid</Name>
      <National>International</National>
      <DataManagementGrade>4.4</DataManagementGrade>
    </Student>

我有 3 个实体:学生(100 个实例);学校(4 个实例)和考试(100 个实例)

这是我在 XSL 文档中使用的代码:

<table class="table table-hover">
  <thead>
    <tr>
      <th scope="col">ID</th>
      <th scope="col">Name</th>
      <th scope="col">National / International</th>
      <th scope="col">Data Management Grade</th>
      <th scope="col">Entrance Exam's subject</th>
      <th scope="col">Exam's Grade</th>

    </tr>
  </thead>

  <tbody>

    <xsl:for-each select="data/Students/Student">

      <tr>

        <td>
          <xsl:value-of select="id"/></td>
        <td>
          <xsl:value-of select="Name"/></td>
        <td>
          <xsl:value-of select="National"/></td>
        <td>
          <xsl:value-of select="DataManagementGrade"/></td>

        <td></td>
        <td></td>

      </tr>

    </xsl:for-each>

  </tbody>
</table>

结果如下: Result of my XSL and XML document

如您所见,最后两列为空(入学考试的主题 + 来自 'Exam' 实例的考试成绩),我不知道如何从实体 'Exam' 获取数据,因为我是已经在使用 '' 当我尝试将 'xsl:for-each select' 添加到考试实例时,我的所有列都为空或 [= 的一部分35=] 文档不完整。

我尝试了很多东西并在互联网上进行了研究,但我没有成功找到任何解决方案。 'Exam' 和 'Student' 共享属性 'id' 我想创建一个密钥来解决此类问题,但是当我尝试创建和使用我的密钥 none数据出现在文档中。 另外,对于这些实体的每个实例,“Exam”的“id 1”必须与“Student”的“id 1”行相匹配。

如果有人能解决我的问题,我将不胜感激,谢谢

您可以使用 XPath 进行导航。以下是如何查找与当前节点(<Student> 的)<id>.

具有相同 <id><Exam>
<xsl:for-each select="Student">
  <!-- ... -->
  <td><xsl:value-of select="/*/Exams/Exam[id = current()/id]/ExamName" /></td>
  <!-- ... -->
</xsl:for-each>

您也可以将其保存在变量中并re-use它。

<xsl:for-each select="Student">
  <!-- Entrance Exam -->
  <xsl:variable name="exam" select="/*/Exams/Exam[id = current()/id]" />

  <!-- ... -->
  <td><xsl:value-of select="$exam/ExamName" /></td>
  <td><xsl:value-of select="$exam/ExamGrade" /></td>
  <!-- ... -->
</xsl:for-each>

或者,您可以使用 XSL 密钥,在样式表的 top-level 处定义一次:

<xsl:key name="examById" match="Exam" use="id" />

<xsl:for-each select="Student">
  <!-- ... -->
  <td><xsl:value-of select="key('examById', id)/ExamName" /></td>
  <td><xsl:value-of select="key('examById', id)/ExamGrade" /></td>
  <!-- ... -->
</xsl:for-each>