2017-09-17 176 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

歡迎您! –