XSLT – 转换定义列表 (TEI)
XSLT – transforming definition lists (TEI)
我想不出一个很简单的事情!
我正在尝试编写一个用于转换定义列表的模板。
<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
标签(两次)。有什么简单的方法可以做到这一点吗?
上面的模板抛出错误,指出对模板的嵌套调用过多(样式表可能正在循环)。
这应该适用于您发布的代码段:
<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>
我想不出一个很简单的事情!
我正在尝试编写一个用于转换定义列表的模板。
<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
标签(两次)。有什么简单的方法可以做到这一点吗?
上面的模板抛出错误,指出对模板的嵌套调用过多(样式表可能正在循环)。
这应该适用于您发布的代码段:
<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>