2017-09-17 84 views
3

我正在使用XSLT 3.0将XML文件输出为HTML,并且在删除逗号和句点之前的空格时遇到了问题。下面是我遇到的具体问题的一个示例:XML中包含行/回车符,它们正在HTML中复制。通常这不是问题,因为浏览器将白色空间折叠到一个空白区域;不过,正如您在下面的示例中所看到的,它在逗号和句点之前保留了一个空格。 (注:关于XML:这是一个中世纪手稿的文本编码,因此它可以有不同的元素,并且它可以出现在不同层次的其他元素中嵌套)。XML - XSLT到HTML转换 - 消除特定的行/回车

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>. 
+1

是否在样式表中添加''解决了问题? –

+0

@Tim C--它解决了一个问题并引入了其他问题。逗号和句点之前的空格问题已解决,但它也会折叠需要空格的元素之间的空格。 – idjet

+0

您是否可以编辑您的问题以显示您需要的实际html输出?谢谢! –

回答

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>. 
1

在你的答案你自己的帖子你写,你“不明白为什么有差别”。让我试着帮忙:例如,您需要避免choicepersName[choice]内的所有空白子节点被解析,字面意思是<选项>和<orig>之间的空格。这些不是你内容的一部分,而只是TEI结构的一部分,不得不忽略。当你使用TEI时,这个问题会经常发生,并且会在不同的层面上出现。

这里的这些模板应该演示如何以更“理解”的方式来解决这个问题。除了应用所有模板(并因此包括文本节点),您可以明确地仅命名您的输出所需的元素。

<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始终包含choiceregorig

+0

阅读它们我真的很感激你花时间回答这个问题。 – idjet

+0

欢迎您! –