XML - XSLT到HTML的转换 - 消除特定的行/回车

时间:2017-09-17 21:37:42

标签: html xml xslt tei

我正在使用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>.

2 个答案:

答案 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 choicereg的情况下才有效。

答案 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>.