XSLT XML到HTML交叉表
我正试图从ToDoList的XML文件中创建交叉表,下面是一个示例XML文件:XSLT XML到HTML交叉表,html,xslt,crosstab,Html,Xslt,Crosstab,我正试图从ToDoList的XML文件中创建交叉表,下面是一个示例XML文件: <?xml version="1.0" encoding="utf-16" ?> <TODOLIST PROJECTNAME="Projects"> <TASK TITLE="proj1" ID="1" NUMPERSON="1" PERSON="Chris" NUMTAGS="1" TAG="Caro" CALCTIMEESTIMATE="36"/> <TA
<?xml version="1.0" encoding="utf-16" ?>
<TODOLIST PROJECTNAME="Projects">
<TASK TITLE="proj1" ID="1" NUMPERSON="1" PERSON="Chris" NUMTAGS="1" TAG="Caro" CALCTIMEESTIMATE="36"/>
<TASK TITLE="proj2" ID="2" NUMPERSON="1" PERSON="Chris" NUMTAGS="1" TAG="Nat" CALCTIMEESTIMATE="8" />
<TASK TITLE="proj4" ID="4" NUMPERSON="1" PERSON="Chris" NUMTAGS="1" TAG="Caro" CALCTIMEESTIMATE="36" />
<TASK TITLE="proj5" ID="5" NUMPERSON="1" PERSON="Sahb" NUMTAGS="1" TAG="Nat" CALCTIMEESTIMATE="128" />
<TASK TITLE="proj32" ID="32" NUMPERSON="2" PERSON="Seb" PERSON1="Chris" NUMTAGS="1" TAG="Nat" CALCTIMEESTIMATE="0.90" />
</TODOLIST>
每个任务都是一个元素,所有信息都是属性。我想制作一个这样的表格,标签作为第一行,人物作为第一列
<table>
<tr>
<td></td>
<td>Caro</td>
<td>Nat</td>
</tr>
<tr>
<td>Chris</td>
<td>72</td>
<td>8</td>
</tr>
<tr>
<td>Sahb</td>
<td>128</td>
<td>0</td>
</tr>
<tr>
<td>Seb, Chris</td>
<td>0</td>
<td>9</td>
</tr>
</table>
正如你所看到的,同一个人可以有很多项目,我想根据标签为每个人加上CALCTIMEESTIMATE。我可以和你一起坐第一排
<xsl:key name="dtag" match="/TODOLIST/TASK/@TAG" use="." />
<xsl:for-each select="TASK/@TAG[generate-id() = generate-id(key('dtag', .)[1])]">
<td>
<xsl:value-of select="."/>
</td>
</xsl:for-each>
但是求和函数不能给出期望的结果。我错过了什么?有没有一种简单的方法可以根据两个属性求和?ToDoList使用XSLT1.0,这就是为什么我不能使用不同的值
这是完整的XSLT,我尝试了很多不同的东西,我试图让它只为Chris工作,但它不能加上他的两个项目
<xsl:template match="TODOLIST">
<xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
<html>
<head>
<title>Projects..</title>
</head>
<body>
<table>
<caption>Projects..</caption>
<thead>
<tr>
<td></td>
<xsl:for-each select="TASK/@TAG[generate-id() = generate-id(key('dtag', .)[1])]">
<th scope="col">
<xsl:value-of select="."/>
</th>
</xsl:for-each>
</tr>
</thead>
<tbody>
<xsl:apply-templates select="TASK/@PERSON[generate-id() = generate-id(key('dperson', .)[1])]" />
</tbody>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="TASK/@PERSON">
<tr>
<th scope="row">
<xsl:value-of select="."/>
</th>
<xsl:apply-templates select="/TODOLIST/TASK/@TAG[generate-id() = generate-id(key('dtag', .)[1])]" />
</tr>
</xsl:template>
<xsl:template match="/TODOLIST/TASK/@TAG">
<td>
<xsl:value-of select="sum(../@CALCTIMEESTIMATE[../@PERSON = 'Chris'])" />
</td>
</xsl:template>
要使总和起作用,您需要知道当前人员和当前标签 在与TASK/@PERSON匹配的当前模板中,应将属性的当前值传递给下一个模板
<xsl:apply-templates
select="/TODOLIST/TASK/@TAG[generate-id() = generate-id(key('dtag', .)[1])]">
<xsl:with-param name="PERSON" select="." />
</xsl:apply-templates>
然后,在与@TAG匹配的模板中,您可以访问SUM中的“dperson”键,因此您可以对该人员和当前标记的所有任务进行求和,如下所示:
<xsl:template match="/TODOLIST/TASK/@TAG">
<xsl:param name="PERSON" />
<td>
<xsl:value-of
select="sum(key('dperson', $PERSON)[../@TAG = current()]/../@CALCTIMEESTIMATE)"/>
</td>
</xsl:template>
是否有可能显示您正在使用的完整XSLT,特别是您提到的未给出所需结果的sum函数?谢谢我添加了XSLT模板。起初我没有模板,但我尝试了很多不同的东西。谢谢你的关注,谢谢!这很有效!我知道这和钥匙有关。当有两个人的时候,我仍然需要弄清楚如何求和,例如:塞布,克里斯。我以后再试试。再次感谢你。