2013-07-09 20 views
0

由於我正在爲TEI文本創建特殊的XSL,所以確實遇到了一個大問題。在TEI規範,從一本書標準音符編碼一樣,(假設信天翁是,在一張紙上,將獲得注字):這是不是很XML友好XSL:在XML標記/節點前建立HTML鏈接

<p>— Cher Cléonte, me dit-il, dès que <pb xml:id="nn2_4" n="4"/> je fus entré dans sa 
chambre, je vous ai envoyé chercher afin que vous prissiez part au divertissement que je 
dois avoir aujourd'hui. Je dînai<note type=glossary n="nn2_4n1">déjeunai</note> il y a quelque temps en 
un lieu où il se rencontra trois de ces messieurs qui font profession de ne rien ignorer 

,但...這是標準。我想要做的是,通過XSL處理,可以添加一些圍繞「dînai」的HTML(對於<note>標籤前面的每個單詞都是相同的)。

<span id="nn2_4n1" class="glossary">dînai</span> 

(註釋的內容位於網頁的另一個地方。)

這樣做的目的是,例如,做筆記的內容出現了這個詞,dînai在一個簡單的「懸停」上。

如何選擇標籤前的最後一個詞並做些什麼?有沒有辦法做到這一點?用XSL?用另一種方式 ?

非常感謝您的回答! Christophe

P. S::我很抱歉我的可怕的英語。

+1

我相信TEI是基於XML的,所以它應該是可能的。您能否修改您的問題以顯示您正在處理的TEI的更大樣本(即圍繞'信天翁'的元素)以及您想要生成的HTML?謝謝! –

+0

請告訴我們您是否希望使用XSLT 2.0或1.0作爲「for-each-group ending-with =」note「'可以輕鬆完成。 –

+0

非常感謝您的關注!我試圖以你所要求的方式修改我的問題:希望這種方式更清晰! 沒有什麼阻止我使用XSLT 2.0,因爲不需要遵從舊瀏覽器。 – DonRamiro

回答

1

假設XSLT 2.0處理程序可以使用

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"> 

<xsl:template match="@* | node()" mode="#all"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* , node()" mode="#current"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[note]"> 
    <xsl:copy> 
    <xsl:for-each-group select="node()" group-ending-with="note"> 
     <xsl:choose> 
     <xsl:when test="current-group()[last()][self::note]"> 
      <xsl:apply-templates select="current-group()[position() lt last() - 2]"/> 
      <xsl:apply-templates select="current-group()[last() - 1]" mode="wrap"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:apply-templates select="current-group()"/> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="text()" mode="wrap"> 
    <xsl:analyze-string select="." regex="\w+$"> 
    <xsl:matching-substring> 
     <span id="{current-group()[last()]/@n}" class="{current-group()[last()]/@type}"> 
     <xsl:value-of select="."/> 
     </span> 
    </xsl:matching-substring> 
    <xsl:non-matching-substring> 
     <xsl:value-of select="."/> 
    </xsl:non-matching-substring> 
    </xsl:analyze-string> 
</xsl:template> 

</xsl:stylesheet> 

它把輸入

<p>— Cher Cléonte, me dit-il, dès que <pb xml:id="nn2_4" n="4"/> je fus entré dans sa 
chambre, je vous ai envoyé chercher afin que vous prissiez part au divertissement que je 
dois avoir aujourd'hui. Je dînai<note type="glossary" n="nn2_4n1">déjeunai</note> il y a quelque temps en 
un lieu où il se rencontra trois de ces messieurs qui font profession de ne rien ignorer</p> 

到結果

<p>— Cher Cléonte, me dit-il, dès que je fus entré dans sa 
chambre, je vous ai envoyé chercher afin que vous prissiez part au divertissement que je 
dois avoir aujourd'hui. Je <span id="nn2_4n1" class="glossary">dînai</span> il y a quelque temps en 
un lieu où il se rencontra trois de ces messieurs qui font profession de ne rien ignorer</p> 

即當前從輸入滴note元件,如果你想在它的地方處理更改

<xsl:when test="current-group()[last()][self::note]"> 
    <xsl:apply-templates select="current-group()[position() lt last() - 2]"/> 
    <xsl:apply-templates select="current-group()[last() - 1]" mode="wrap"/> 
</xsl:when> 

<xsl:when test="current-group()[last()][self::note]"> 
    <xsl:apply-templates select="current-group()[position() lt last() - 2]"/> 
    <xsl:apply-templates select="current-group()[last() - 1]" mode="wrap"/> 
    <xsl:apply-templates select="current-group()[last()]"/> 
</xsl:when> 

我假設一個note由純文本節點之前爲你的樣品中,如果我們有例如Je <b>dînai</b><note type="glossary" n="nn2_4n1">déjeunai</note>它比較複雜。

我只用一個簡單的輸入樣本進行了測試,用更復雜的測試自己,並在遇到問題時回報。

+0

非常感謝你的解決方案!這是非常令人難以置信的,而且非常好。 但是我必須承認,我不明白你是怎麼進行的。你可能沒有時間,但我真的不明白第一個塊是什麼(匹配=「@ * ...」)?並且 - 很抱歉在正則表達式中是這樣一個noob - 但我無法找到\ w + $指的是什麼? 無論如何:一個很感謝你的幫助! – DonRamiro

+0

那麼模板與'

+0

這裏是一個鏈接到出版商的網站http://www.wrox.com/WileyCDA/WroxTitle/XSLT-2-0-和 - XPath-2-0-Programmer-s-Reference-4th-Edition-Print-eBook-Bundle.productCd-1118642929.html。 –