我有一个XML文档看起来像这样。
<Results>
<Name>Lab Asst1 </Name>
<Subject> Math </Subject>
<Marks>96</Marks>
<Grade>A</Grade>
<Name>Student1</Name>
<Subject>Math</Subject>
<Marks>90</Marks>
<Grade>A</Grade>
<Name>Student1</Name>
<Subject>English</Subject>
<Marks>70</Marks>
<Grade>B</Grade>
<Name>Lab Asst1 </Name>
<Subject> Science</Subject>
<Marks>99</Marks>
<Grade>A</Grade>
<Name>Student2</Name>
<Subject>Science</Subject>
<Marks>70</Marks>
<Grade>B</Grade>
</Results>
使用XSL是什么显示最简单的方式,而不显示<Name>
两次元素? 我想首先显示实验室Asst1结果,假设有一个使用这个值的文本框(从C#代码进来):基本上,这东西确实首先这部分:
User: <Name>
Your results are:
<table>
<tr>
<td> Subject </td>
<td> Marks </td>
<td> Grade </td>
</tr>
然后调用另一个模板等,或换每个或某事做....
<tr>
<td> <xsl:value-of select="Subject"/> </td>
<td> <xsl:value-of select="Marks"/> </td>
<td> <xsl:value-of select="Grade"/> </td>
</tr>
这样,我的结果显示如下:
User: Lab Asst1
Your results are:
Subject | Marks | Grade
-------------------------------------
Science| 99 | A
Math | 96 | A
User:Student1
Your results are:
Subject | Marks | Grade
-----------------------------
Math | 95 | A
English | 70 | B
User:Student2
Your results are:
Subject | Marks | Grade
-----------------------------
Math | 70 | B
这一转变 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kPersByName" match="Name" use="."/>
<xsl:key name="kData" match="*"
use="preceding-sibling::Name[1]"/>
<xsl:template match="/*">
<xsl:for-each select=
"Name[generate-id()
=
generate-id(key('kPersByName', .)[1])
]
">
<xsl:variable name="vData" select="key('kData', .)"/>
User: <xsl:value-of select="."/>
Your results are:
<table border="1">
<tr>
<td> Subject </td>
<td> Marks </td>
<td> Grade </td>
</tr>
<xsl:for-each select="$vData[self::Subject]">
<tr>
<td><xsl:value-of select="."/></td>
<td><xsl:value-of select="following-sibling::Marks[1]"/></td>
<td><xsl:value-of select="following-sibling::Grade[1]"/></td>
</tr>
</xsl:for-each>
</table>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当施加到所提供的XML文档 :
<Results>
<Name>Lab Asst1 </Name>
<Subject> Math </Subject>
<Marks>96</Marks>
<Grade>A</Grade>
<Name>Student1</Name>
<Subject>Math</Subject>
<Marks>90</Marks>
<Grade>A</Grade>
<Name>Student1</Name>
<Subject>English</Subject>
<Marks>70</Marks>
<Grade>B</Grade>
<Name>Lab Asst1 </Name>
<Subject> Science</Subject>
<Marks>99</Marks>
<Grade>A</Grade>
<Name>Student2</Name>
<Subject>Science</Subject>
<Marks>70</Marks>
<Grade>B</Grade>
</Results>
产生想要的,正确的结果 :
User: Lab Asst1
Your results are:
<table border="1"> <tr>
<td> Subject </td>
<td> Marks </td>
<td> Grade </td>
</tr>
<tr>
<td> Math </td>
<td>96</td>
<td>A</td>
</tr>
<tr>
<td> Science</td>
<td>99</td>
<td>A</td>
</tr>
</table>
User: Student1
Your results are:
<table border="1">
<tr>
<td> Subject </td>
<td> Marks </td>
<td> Grade </td>
</tr>
<tr>
<td>Math</td>
<td>90</td>
<td>A</td>
</tr>
<tr>
<td>English</td>
<td>70</td>
<td>B</td>
</tr>
</table>
User: Student2
Your results are:
<table border="1">
<tr>
<td> Subject </td>
<td> Marks </td>
<td> Grade </td>
</tr>
<tr>
<td>Science</td>
<td>70</td>
<td>B</td>
</tr>
</table>
请注意 :
所述用于分组Muenchian方法被使用 。
在XSLT 2.0更容易,并使用更方便<xsl:for-each-group>
指令。