所以下面你可以看到我给定的XML。我匹配了模板,我已经在学生节点 (xsl:template match="Class/Student"
(:
<Class>
<Heading>This is a sentence.</Heading>
<Student>Alex</Student>
<Student>Emilia</Student>
<Student>John</Student>
</Class>
现在我需要从所有学生中获取一个列表,我想得到的内容应该如下所示:
<ul>
<li>Alex</li>
<li>Emilia</li>
<li>John</li>
</ul>
我想我的思维方式有误,因为我的 XSLT 目前看起来像这样:
<xsl:template match="Class/Student">
<ul>
<xsl:for-each select="../Student">
<li>
<xsl:apply-templates/>
</li>
</xsl:for-each>
</ul>
</xsl:template>
但我实际得到的是:
<ul>
<li>Alex</li>
<li>Emilia</li>
<li>John</li>
<ul>
<ul>
<li>Alex</li>
<li>Emilia</li>
<li>John</li>
<ul>
<ul>
<li>Alex</li>
<li>Emilia</li>
<li>John</li>
<ul>
我认为问题是我使用的 for-each 但我不知道在这种情况下我还应该做什么。
你想要每Class
一个ul
,而不是每Student
,所以改变
<xsl:template match="Class/Student">
自
<xsl:template match="Class">
然后更改
<xsl:for-each select="../Student">
自
<xsl:for-each select="Student">
获取当前节点的每个Student
子元素一个li
Class
。
由于您已经采取了将模板匹配与template match="Class/Student"
一起使用的步骤,因此我建议坚持使用这种方法并简单地编写两个模板,一个用于Class
元素,另一个用于Student
元素
<xsl:template match="Class">
<ul>
<xsl:apply-templates select="Student"/>
</ul>
</xsl:template>
<xsl:template match="Student">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
对于更复杂的情况,这会导致更干净、更模块化的代码。