TEI xsl:template 显示标签 <g> 相对字符名
TEI xsl:template to show tag <g> relative charName
在 tei 文件的 TEI header 中,我声明了一些字符:
`
<charDecl>
<char xml:id="char1">
<charName>Vnc.</charName>
<desc>Tractus longus</desc>
</char>
<char xml:id="char2">
<charName>Drag.</charName>
<desc>Interclusio uncinata</desc>
</char>
...
</charDecl>
`
在我有标签的 tei 的 body 文本内:
Lorem ipsum <g ref="#char2"/> dolor sit II. Cotylus habet <g ref="#char1">—</g>
我希望它会像这样显示:
Lorem ipsum [Drag.] dolor sit II. Cotylus habet —[Vnc.]
如何使用 xsl 样式表 xsl:template?
我试过这个但不起作用:
<xsl:key name="char" match="tei:teiHeader/encodingDesc/charDecl/char" use="@xml:id"/>
<xsl:template match="tei:g[@ref]">
<xsl:apply-templates />
<span title="<xsl:value-of select="key('char',substring-after(@ref,'#'))/desc"/>">[<xsl:value-of select="key('char',substring-after(@ref,'#'))/charName"/>]</span>
</xsl:template>
在文件头内 tei 我 link 到样式表:
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="file:teilite.rnc" type="compact"?>
<?xml-stylesheet type="text/xsl" href="../mainstyle.xsl"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
里面主要的样式我有:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:eg="http://www.tei-c.org/ns/Examples"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:exsl="http://exslt.org/common"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
extension-element-prefixes="exsl msxsl"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:html="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xsl tei xd eg fn #default">
...
<xsl:include href="rendchars.xsl"/>
在 rendchars.xsl 内开始:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:teix="http://www.tei-c.org/ns/Examples" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:teidocx="http://www.tei-c.org/ns/teidocx/1.0"
exclude-result-prefixes="a fo html rng tei teix teidocx" version="2.0">
我也尝试了这些对我不起作用的代码:
<xsl:key name="chname" match="tei:teiHeader/encodingDesc/charDecl/char" use="@xml:id"/>
<xsl:template match="g[@ref]">
<span title="{key('chname',substring-after(@ref,'#'))/tei:desc}">[<xsl:value-of select="key('chname',substring-after(@ref,'#'))/tei:charName"/>]</span><xsl:text></xsl:text>
</xsl:template>
和
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="charDecl"/>
<xsl:template match="g[@ref]">
<xsl:value-of select="id(substring-after(@ref,'#'))/charName"/>
</xsl:template>
和
<xsl:key name="chname" match="tei:teiHeader/tei:encodingDesc/tei:charDecl/tei:char" use="@xml:id"/>
<xsl:template match="g[@ref]">
<xsl:apply-templates/>
<span title="{key('chname',substring-after(@ref,'#'))/tei:desc}">[<xsl:value-of select="key('chname',substring-after(@ref,'#'))/tei:charName"/>]</span><xsl:text></xsl:text>
</xsl:template>
假设 XSLT 2.0 使用 id
函数就足够了:
<xsl:template match="g[@ref]">
<xsl:value-of select="id(substring(@ref, 2))/charName"/>
</xsl:template>
完整示例:http://xsltransform.net/a9Gix6.
至于你的尝试,如果所有元素都在同一个命名空间中,那么我认为你想要 <span title="{key('char',substring-after(@ref,'#'))/tei:desc}">[<xsl:value-of select="key('char',substring-after(@ref,'#'))/tei:charName"/>]</span>
,也就是说,你需要确保在所有路径中使用 TEI 元素的前缀。并且密钥需要更改为 <xsl:key name="char" match="tei:teiHeader/tei:encodingDesc/tei:charDecl/tei:char" use="@xml:id"/>
我解决了这个问题:
<xsl:key name="chname" match="tei:teiHeader/tei:encodingDesc/tei:charDecl/tei:char" use="@xml:id" />
<xsl:template match="tei:g[@ref]">
<xsl:apply-templates/>
<span title="{key('chname',substring-after(@ref,'#'))/tei:desc}" >[<xsl:value-of select="key('chname',substring-after(@ref,'#'))/tei:charName"/>]</span><xsl:text></xsl:text>
</xsl:template>
在 tei 文件的 TEI header 中,我声明了一些字符: `
<charDecl>
<char xml:id="char1">
<charName>Vnc.</charName>
<desc>Tractus longus</desc>
</char>
<char xml:id="char2">
<charName>Drag.</charName>
<desc>Interclusio uncinata</desc>
</char>
...
</charDecl>
`
在我有标签的 tei 的 body 文本内:
Lorem ipsum <g ref="#char2"/> dolor sit II. Cotylus habet <g ref="#char1">—</g>
我希望它会像这样显示:
Lorem ipsum [Drag.] dolor sit II. Cotylus habet —[Vnc.]
如何使用 xsl 样式表 xsl:template? 我试过这个但不起作用:
<xsl:key name="char" match="tei:teiHeader/encodingDesc/charDecl/char" use="@xml:id"/>
<xsl:template match="tei:g[@ref]">
<xsl:apply-templates />
<span title="<xsl:value-of select="key('char',substring-after(@ref,'#'))/desc"/>">[<xsl:value-of select="key('char',substring-after(@ref,'#'))/charName"/>]</span>
</xsl:template>
在文件头内 tei 我 link 到样式表:
<?xml version="1.0" encoding="UTF-8"?>
<?oxygen RNGSchema="file:teilite.rnc" type="compact"?>
<?xml-stylesheet type="text/xsl" href="../mainstyle.xsl"?>
<TEI xmlns="http://www.tei-c.org/ns/1.0">
里面主要的样式我有:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:eg="http://www.tei-c.org/ns/Examples"
xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:exsl="http://exslt.org/common"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
extension-element-prefixes="exsl msxsl"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:html="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xsl tei xd eg fn #default">
...
<xsl:include href="rendchars.xsl"/>
在 rendchars.xsl 内开始:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0"
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns:teix="http://www.tei-c.org/ns/Examples" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:teidocx="http://www.tei-c.org/ns/teidocx/1.0"
exclude-result-prefixes="a fo html rng tei teix teidocx" version="2.0">
我也尝试了这些对我不起作用的代码:
<xsl:key name="chname" match="tei:teiHeader/encodingDesc/charDecl/char" use="@xml:id"/>
<xsl:template match="g[@ref]">
<span title="{key('chname',substring-after(@ref,'#'))/tei:desc}">[<xsl:value-of select="key('chname',substring-after(@ref,'#'))/tei:charName"/>]</span><xsl:text></xsl:text>
</xsl:template>
和
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="charDecl"/>
<xsl:template match="g[@ref]">
<xsl:value-of select="id(substring-after(@ref,'#'))/charName"/>
</xsl:template>
和
<xsl:key name="chname" match="tei:teiHeader/tei:encodingDesc/tei:charDecl/tei:char" use="@xml:id"/>
<xsl:template match="g[@ref]">
<xsl:apply-templates/>
<span title="{key('chname',substring-after(@ref,'#'))/tei:desc}">[<xsl:value-of select="key('chname',substring-after(@ref,'#'))/tei:charName"/>]</span><xsl:text></xsl:text>
</xsl:template>
假设 XSLT 2.0 使用 id
函数就足够了:
<xsl:template match="g[@ref]">
<xsl:value-of select="id(substring(@ref, 2))/charName"/>
</xsl:template>
完整示例:http://xsltransform.net/a9Gix6.
至于你的尝试,如果所有元素都在同一个命名空间中,那么我认为你想要 <span title="{key('char',substring-after(@ref,'#'))/tei:desc}">[<xsl:value-of select="key('char',substring-after(@ref,'#'))/tei:charName"/>]</span>
,也就是说,你需要确保在所有路径中使用 TEI 元素的前缀。并且密钥需要更改为 <xsl:key name="char" match="tei:teiHeader/tei:encodingDesc/tei:charDecl/tei:char" use="@xml:id"/>
我解决了这个问题:
<xsl:key name="chname" match="tei:teiHeader/tei:encodingDesc/tei:charDecl/tei:char" use="@xml:id" />
<xsl:template match="tei:g[@ref]">
<xsl:apply-templates/>
<span title="{key('chname',substring-after(@ref,'#'))/tei:desc}" >[<xsl:value-of select="key('chname',substring-after(@ref,'#'))/tei:charName"/>]</span><xsl:text></xsl:text>
</xsl:template>