我无法弄清楚一件非常简单的事情!
我正在尝试编写一个用于转换定义列表的模板。
<list type="gloss">
<head>Slovníček pojmů</head>
<label xml:lang="cs">Pojem</label>
<item>Dojem!</item>
<label xml:lang="cs">Stavba</label>
<item>Stavení</item>
</list>
当前模板:
<xsl:template match="tei:list[@type='gloss']">
<div class="glossary">
<p>
<b>
<xsl:apply-templates select="tei:head"/>
</b>
</p>
<dl>
<xsl:choose>
<xsl:when test="tei:label">
<dt>
<xsl:apply-templates select="tei:label"/>
</dt>
</xsl:when>
<xsl:otherwise>
<dd>
<xsl:apply-templates select="tei:item"/>
</dd>
</xsl:otherwise>
</xsl:choose>
</dl>
</div>
</xsl:template>
没有任何作用。我尝试过for-each
循环,因为将模板应用于原子值会产生问题。外部模板(在此之外)通常以错误的方式呈现head
标记(两次)。有什么简单的方法可以做到这一点吗?
上面的模板引发了错误,提到模板的嵌套调用太多(样式表可能正在循环)。
答案 0 :(得分:1)
这适用于您发布的代码段:
<xsl:template match="list[@type='gloss']">
<div class="glossary">
<p>
<b>
<xsl:value-of select="head"/>
</b>
</p>
<dl>
<xsl:for-each select="label">
<dt>
<xsl:value-of select="."/>
</dt>
<dd>
<xsl:value-of select="following-sibling::item[1]"/>
</dd>
</xsl:for-each>
</dl>
</div>
</xsl:template>
或者,如果您愿意:
<xsl:template match="list[@type='gloss']">
<div class="glossary">
<xsl:apply-templates select="head"/>
<dl>
<xsl:apply-templates select="label | item"/>
</dl>
</div>
</xsl:template>
<xsl:template match="head">
<p>
<b>
<xsl:value-of select="."/>
</b>
</p>
</xsl:template>
<xsl:template match="label">
<dt>
<xsl:value-of select="."/>
</dt>
</xsl:template>
<xsl:template match="item">
<dd>
<xsl:value-of select="."/>
</dd>
</xsl:template>
<强>结果强>
<div class="glossary">
<p>
<b>Slovníček pojmů</b>
</p>
<dl>
<dt>Pojem</dt>
<dd>Dojem!</dd>
<dt>Stavba</dt>
<dd>Stavení</dd>
</dl>
</div>