如何使用xslt中的键替换节点的名称

时间:2013-12-02 23:39:08

标签: xml xslt xslt-1.0

我需要使用密钥来查找不同级别的不同节点的相应节点。我不明白如何用键替换节点名称而不会出现错误。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     <xsl:key name = "coursesbygrade" match = "course" use = "grade" />
     <xsl:key name = "profbyid" match = "prof" use = "@instid" />
    <xsl:output method = "html" />
    <xsl:template match = "/">
    <html>
     <head><link rel = "stylesheet" type = "text/css" href = "./courses.css" /></head>
     <body>
     <div class = 'container'>
     <table>
   <xsl:for-each select = "//course[generate-id(.) = generate-id(key('coursesbygrade', grade)[1])]">
   <xsl:sort select = "grade" />
   <tr>
     <td><xsl:value-of select = "grade" /></td>
     <td>
     <xsl:for-each select = "key('coursesbygrade', grade)">
      <xsl:value-of select = "dept" />
      <xsl:text> </xsl:text>
      <xsl:value-of select = "num" />
      <xsl:text> (</xsl:text>
          <xsl:value-of select = "//(key('profbyid', 'num[@refinstid]'))/name" />
      <xsl:text>)</xsl:text>

1 个答案:

答案 0 :(得分:0)

如果没有更多信息,例如您要实现的目标,甚至错误信息实际上是什么,我猜您的问题就在于此行

<xsl:value-of select = "//(key('profbyid', 'num[@refinstid]'))/name" />

您不需要在这里使用//作为开始,因为该键返回实际节点,因此您不必在层次结构中“搜索”它。此外,您在键的第二个参数周围有撇号,这意味着它将查找字符串文字。我猜你真的想用节点(或属性)的值进行搜索。

这可能(可能)是您需要的陈述

<xsl:value-of select = "key('profbyid', num/@refinstid)/name" />

因此,它获取 num 元素的 refinstid 属性的值,并使用键查找匹配的 prof 节点,然后返回名称