xslt 创建的 html 页面中未显示的诗歌文本部分
Portion of poetry text not shown in html page created by xslt
我正在做一个文本的数字化,但是文本中间的部分诗歌没有显示,你能帮我吗?
XSL 代码:http://pastebin.com/TkgZLurQ
XML代码:http://pastebin.com/fyA4Ka1f
XML 文件中未转换的部分是:
<div type="poetry">
<epigraph>
<lg rhyme="ababcb">
<l><name type="person">Beatrice</name> tutta ne l’etterne <rhyme label="a">rote</rhyme></l>
<l>fissa con li occhi stava; e io in <rhyme label="b">lei</rhyme></l>
<l>le luci fissi, di là sù <rhyme label="a">rimote</rhyme>.</l>
<l>Nel suo aspetto tal dentro mi <rhyme label="b">fei</rhyme>,</l>
<l>qual si fé <name type="person">Glauco</name> nel gustar de l’<rhyme label="c">erba</rhyme></l>
<l>che ’l fé consorto in mar de li altri <rhyme label="b">dèi</rhyme>.</l>
</lg>
</epigraph>
</div>
您有一个模板 <xsl:template match="tei:body/tei:div[@type='racconto']/tei:div[@type='poetry']">
和一个模板 <xsl:template match="tei:body/tei:div[@type='racconto']">
,但后者不使用 apply-templates
,因此永远不会应用前一个模板。你的整个方法是错误的,不要在匹配模板中使用 for-each
来处理一些子元素,而是使用 apply-templates
并为子元素编写模板。
并且您可以通过使用 <div>..</div>
之类的文字结果元素而不是 <xsl:element name="div">...</xsl:element>
.
来节省一些输入
所以不用
<xsl:template match="tei:body/tei:div[@type='poetry']">
<xsl:element name="div">
<xsl:attribute name="class">poetry</xsl:attribute>
<xsl:for-each select="tei:epigraph/tei:lg/tei:l">
<xsl:element name="p">
<xsl:attribute name="class">poetry</xsl:attribute>
<xsl:element name="i">
<xsl:value-of select="."/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
使用
<xsl:template match="tei:body/tei:div[@type='poetry']">
<div class="poetry">
<!-- depending on your needs <xsl:apply-templates/> suffices, or use -->
<xsl:apply-templates select="tei:epigraph/tei:lg/tei:l"/>
</div>
</xsl:template>
<xsl:template match="tei:epigraph/tei:lg/tei:l">
<p class="poetry">
<i>
<xsl:apply-templates/>
</i>
</p>
</xsl:template>
对于 <xsl:template match="tei:body/tei:div[@type='racconto']">
你需要确保你把 <xsl:apply-templates/>
放在那里以确保子节点被处理,因为你有各种各样的东西在那里我无法告诉你想要的确切位置它,但一般方法如上例所示,将输入的一个元素映射到你想要的 HTML,然后使用应用模板处理它的子元素,确保你为那些需要输出的元素编写模板。
我正在做一个文本的数字化,但是文本中间的部分诗歌没有显示,你能帮我吗?
XSL 代码:http://pastebin.com/TkgZLurQ XML代码:http://pastebin.com/fyA4Ka1f
XML 文件中未转换的部分是:
<div type="poetry">
<epigraph>
<lg rhyme="ababcb">
<l><name type="person">Beatrice</name> tutta ne l’etterne <rhyme label="a">rote</rhyme></l>
<l>fissa con li occhi stava; e io in <rhyme label="b">lei</rhyme></l>
<l>le luci fissi, di là sù <rhyme label="a">rimote</rhyme>.</l>
<l>Nel suo aspetto tal dentro mi <rhyme label="b">fei</rhyme>,</l>
<l>qual si fé <name type="person">Glauco</name> nel gustar de l’<rhyme label="c">erba</rhyme></l>
<l>che ’l fé consorto in mar de li altri <rhyme label="b">dèi</rhyme>.</l>
</lg>
</epigraph>
</div>
您有一个模板 <xsl:template match="tei:body/tei:div[@type='racconto']/tei:div[@type='poetry']">
和一个模板 <xsl:template match="tei:body/tei:div[@type='racconto']">
,但后者不使用 apply-templates
,因此永远不会应用前一个模板。你的整个方法是错误的,不要在匹配模板中使用 for-each
来处理一些子元素,而是使用 apply-templates
并为子元素编写模板。
并且您可以通过使用 <div>..</div>
之类的文字结果元素而不是 <xsl:element name="div">...</xsl:element>
.
所以不用
<xsl:template match="tei:body/tei:div[@type='poetry']">
<xsl:element name="div">
<xsl:attribute name="class">poetry</xsl:attribute>
<xsl:for-each select="tei:epigraph/tei:lg/tei:l">
<xsl:element name="p">
<xsl:attribute name="class">poetry</xsl:attribute>
<xsl:element name="i">
<xsl:value-of select="."/>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
使用
<xsl:template match="tei:body/tei:div[@type='poetry']">
<div class="poetry">
<!-- depending on your needs <xsl:apply-templates/> suffices, or use -->
<xsl:apply-templates select="tei:epigraph/tei:lg/tei:l"/>
</div>
</xsl:template>
<xsl:template match="tei:epigraph/tei:lg/tei:l">
<p class="poetry">
<i>
<xsl:apply-templates/>
</i>
</p>
</xsl:template>
对于 <xsl:template match="tei:body/tei:div[@type='racconto']">
你需要确保你把 <xsl:apply-templates/>
放在那里以确保子节点被处理,因为你有各种各样的东西在那里我无法告诉你想要的确切位置它,但一般方法如上例所示,将输入的一个元素映射到你想要的 HTML,然后使用应用模板处理它的子元素,确保你为那些需要输出的元素编写模板。