<xsl:apply-templates>在<xsl:attribute>之后不适用于子项

时间:2015-09-06 02:19:44

标签: xml xslt

我有一小部分XML用于创建列表,并且出于某种原因,我的模板之一是match =“ref”,样式是ref元素但忽略了xsl:attribute之后的apply-templates调用。所以ref元素的孩子都没有被设计样式。

我的XML在这里:

<list>
<item>London, British Library Harley 2251: <ref
        target="Quis_Dabit/British_Library_Harley_2251/British_Library_Harley_2251_f42v.html"
            ><orig xmlns="http://www.tei-c.org/ns/1.0">To se my joye · my hertis higħ
            plesaunce</orig></ref></item>
<item>London, British Library Harley 2255: <ref
        target="Quis_Dabit/British_Library_Harley_2255/British_Library_Harley_2255_f67r.html"
            ><orig xmlns="http://www.tei-c.org/ns/1.0">to see my Joye / myn hertys hiħ
            plesaunce</orig></ref></item>
<item>Cambridge, Jesus College Q.G.8: 
    <ref target="Quis_Dabit/Jesus_College_Q_G_8/Jesus_Q_G_8_f20r.html">
        <orig xmlns="http://www.tei-c.org/ns/1.0"><hi rend="touched">T</hi>o see my ioye my
                hart<ex>is </ex>high <hi rend="underline">plesauncce</hi>. </orig></ref></item>
<item>Oxford, Bodleian Library Laud 683: <ref target="Quis_Dabit/Laud_683/Laud_683_f78r.html"
            ><orig xmlns="http://www.tei-c.org/ns/1.0">to se mẏ joie / mẏn hertis hiħ
            plesaunce</orig></ref></item>
<item>Oxford, St. John's College 56: <ref target="Quis_Dabit/St_John_56/St_John_56_73v.html"
            ><orig xmlns="http://www.tei-c.org/ns/1.0">To see my ioye / myne hertis hygh
            plesaunce ؛</orig></ref></item></list>

和我的xsl如下所示,并且在事情刚刚退出的时候发表评论:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output method="html" encoding="UTF-8"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="list">
        <ul>
            <xsl:apply-templates/>
        </ul>
</xsl:template>

<xsl:template match="item">
    <li>
        <xsl:apply-templates/>
    </li>
</xsl:template>

<!--from here down it just stops working for no good reason that I know of-->
<xsl:template match="ref">
    <a>
        <xsl:attribute name="href">
            <xsl:value-of select="@target"/>
        </xsl:attribute>
        <xsl:apply-templates/>
    </a>
</xsl:template>

<xsl:template match="orig">
    <span>
        <xsl:apply-templates/>
    </span>
</xsl:template>

<xsl:template match="hi">
    <xsl:choose>
        <xsl:when test="@rend='touched'">
            <span class="touched">
                <xsl:apply-templates/>
            </span>
        </xsl:when>
        <xsl:otherwise>
            <span class="capital">
                <xsl:apply-templates/>
            </span>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="ex">
    <i>
        <xsl:apply-templates></xsl:apply-templates>
    </i>
</xsl:template>

我真的很茫然,因为我写过其他模板做类似的事情而且在那里工作得很好。

1 个答案:

答案 0 :(得分:2)

实际上,您的match="ref"模板效果很好。问题在于应该处理ref的子元素的另一个模板。请注意,示例XML中的orig元素位于命名空间中。您需要声明引用命名空间的前缀:

<xsl:stylesheet .....
xmlns:ns="http://www.tei-c.org/ns/1.0"
exclude-result-prefixes="xs ns"
....>

然后使用该前缀来匹配命名空间中的元素:

<xsl:template match="ns:orig">
    <span>
        <xsl:apply-templates/>
    </span>
</xsl:template>