我正在使用XSLT 3.0将XML文件输出到HTML,我在删除逗号和句点之前的空格时遇到了麻烦。下面是我遇到的精确问题的一个例子:XML中有行/回车符,它在HTML中被重现。通常这不是问题,因为浏览器将白色空间折叠成一个空白区域;但是正如您在下面的示例中所看到的,它在逗号和句点之前保留了空格。
(关于XML的注释:这是中世纪手稿的文本编码,因此可以在其中包含各种元素,并且它可以嵌套在各个级别的其他元素中)。
XML:
<persName>
<choice>
<orig>ar. p<hi rend="sup">a</hi>der</orig>
<reg>Arnaldum Prader</reg>
</choice>
</persName> et socium eius hereticos et vidit ibi cum eis <persName>
<choice>
<orig>P. barrau</orig>
<reg>Poncium Barrau</reg>
</choice>
</persName>, <persName>
<choice>
<orig>Iordanetū del maſ</orig>
<reg>Iordanetum del Mas</reg>
</choice>
</persName>, <persName>
<choice>
<orig>Iordanū de quiders</orig>
<reg>Iordanum de Quiders</reg>
</choice>
</persName> et <persName>
<choice>
<orig>W. Vitał</orig>
<reg>Willelmum Vitalis</reg>
</choice>
</persName> predictum et <persName>
<choice>
<orig>ux̄ dc̄ī W. Vitał</orig>
<reg>uxor dicti Willelmi Vitalis</reg>
</choice>
</persName>.
XML模板:
<!-- format super/sub scripts -->
<xsl:template match="tei:hi" name="template_supersub">
<xsl:choose>
<xsl:when test="@rend ='sup'"><sup class="subsup"><xsl:apply-templates/></sup></xsl:when>
<xsl:when test="@rend ='sub'"><sub class="subsup"><xsl:apply-templates/></sub></xsl:when>
</xsl:choose>
</xsl:template>
<!-- parse persName into <spans> -->
<xsl:template match="tei:persName/tei:choice/tei:reg">
<span class="interpretive"><xsl:apply-templates/></span>
</xsl:template>
<xsl:template match="tei:persName/tei:choice/tei:orig">
<span class="diplomatic"><xsl:apply-templates/></span>
</xsl:template>
当前HTML输出:
<span class="diplomatic">ar. p<sup class="subsup">a</sup>der</span>
<span class="interpretive">Arnaldum Prader</span>
et socium eius hereticos et vidit ibi cum eis
<span class="diplomatic">P. barrau</span>
<span class="interpretive">Poncium Barrau</span>
,
<span class="diplomatic">Iordanetū del maſ</span>
<span class="interpretive">Iordanetum del Mas</span>
,
<span class="diplomatic">Iordanū de quiders</span>
<span class="interpretive">Iordanum de Quiders</span>
et
<span class="diplomatic">W. Vitał</span>
<span class="interpretive">Willelmum Vitalis</span>
predictum et
<span class="diplomatic">ux̄ dc̄ī W. Vitał</span>
<span class="interpretive">uxor dicti Willelmi Vitalis</span>
.
最终,有问题的输出:
Arnaldum Prader et socium eius hereticos et vidit ibi cum eis Poncium Barrau,Iordanetum del Mas,Iordanum de Quiders et Willelmum Vitalis predictum et uxor dicti Willelmi Vitalis。
strip-space,replace(),translate()的各种组合没有针对这个问题。它们通常会导致元素之间的每个空白区域崩溃。
我最理想的是在逗号和句号之前没有空格,在逗号或句号之后没有空格。但我找不到机制,更不用说黑客来解决这个问题。感谢。
所需的HTML输出:
<span class="diplomatic">ar. p<sup class="subsup">a</sup>der</span>
<span class="interpretive">Arnaldum Prader</span> et socium eius
hereticos et vidit ibi cum eis <span class="diplomatic">P.
barrau</span><span class="interpretive">Poncium Barrau</span>, <span
class="diplomatic">Iordanetū del maſ</span><span
class="interpretive">Iordanetum del Mas</span>, <span
class="diplomatic">Iordanū de quiders</span><span
class="interpretive">Iordanum de Quiders</span> et <span
class="diplomatic">W. Vitał</span><span class="interpretive">Willelmum
Vitalis</span> predictum et <span class="diplomatic">ux̄ dc̄ī W.
Vitał</span><span class="interpretive">uxor dicti Willelmi
Vitalis</span>.
答案 0 :(得分:1)
在回答你自己的帖子时,你写道“你不明白为什么会有所作为”。让我试着帮助:你需要避免解析{"jury1": []}
和choice
中的所有空白子节点,字面意思是&lt; choice&gt;之间的空格。和&lt; orig&gt;,例如。这些不是您内容的一部分,只是TEI结构的一部分,必须予以忽略。这是一个在使用TEI时经常会在不同层面上重复出现的问题。
这里的这些模板应该演示如何以更“理解”的方式来解决这个问题。您可以只显示输出所需的元素,而不是应用所有模板(因而包括文本节点)。
persName[choice]
最后评论:请注意您的架构。如果允许<xsl:template match="tei:choice">
<xsl:apply-templates select="tei:reg"/>
<xsl:apply-templates select="tei:orig"/>
</xsl:template>
<xsl:template match="tei:persName[tei:choice]">
<xsl:apply-templates select="tei:choice"/>
</xsl:template>
包含persName
之外的非空格文本(通常是),则应该区别对待。此处的解决方案仅在choice
始终包含persName
choice
和reg
的情况下才有效。
答案 1 :(得分:0)
发布对我自己的问题的回复,以避免一个非常复杂的帖子。
我调整了这个XSL:
<!-- parse persName into <spans> -->
<xsl:template match="tei:persName/tei:choice/tei:reg">
<span class="interpretive"><xsl:apply-templates/></span>
</xsl:template>
<xsl:template match="tei:persName/tei:choice/tei:orig">
<span class="diplomatic"><xsl:apply-templates/></span>
</xsl:template>
对此XSL:
<!-- parse persName into <spans> -->
<xsl:template match="tei:persName">
<span class="interpretive"><xsl:apply-templates select="tei:choice/tei:reg"/></span><span class="diplomatic"><xsl:apply-templates select="tei:choice/tei:orig"/></span>
</xsl:template>
现在它完全根据需要导出HTML。没有其他调整XSL文件。我不明白为什么会有所作为,但这是一个很大的不同。
新HTML:
<span class="interpretive">Arnaldum Prader</span><span
class="diplomatic">ar. p<sup class="subsup">a</sup>der</span> et
socium eius hereticos et vidit ibi cum eis <span
class="interpretive">Poncium Barrau</span><span class="diplomatic">P.
barrau</span>, <span class="interpretive">Iordanetum del Mas</span>
<span class="diplomatic">Iordanetū<span class="line_num diplomatic">
<span class="interpretive"> </span>del maſ</span>, <span
class="interpretive">Iordanum de Quiders</span><span
class="diplomatic">Iordanū de quiders</span> et <span
class="interpretive">Willelmum Vitalis</span><span
class="diplomatic">W. Vitał</span> predictum et <span
class="interpretive">uxor dicti Willelmi Vitalis</span><span
class="diplomatic">ux̄ dc̄ī W. Vitał</span>.