XSLT - 转换清单(TEI)
我无法弄清楚一件非常简单的事情!XSLT - 转换清单(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>
它不应该工作!在提供的模板中,没有dl标签。有了它,将头部分开并将其放在整个dl列表上方是个问题。不管怎样,谢谢你! –
@HonzaHejzl我不确定你的意思。我的答案中显示的结果与您期望的结果不同吗? –
@HonzaHejzl如果你展示一个我们可以自己运行的_complete_例子,回答这个问题会更容易。对于XSLT问题,这意味着:XML输入文档,XSLT样式表和您期望的XML输出。请参阅http://stackoverflow.com/help/mcve。 –
你能表现出更多的XML的和XSLT好吗?你的XSLT引用了命名空间前缀'tei',但是你没有显示这个命名空间的声明。另外,你的XML根本没有任何命名空间,所以它不会被'tei:list'匹配。你也应该显示与'head','label'和'item'匹配的模板,以便我们重现错误。谢谢! –