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>