2017-09-23 54 views
0

對不起,我的英語。 我正在尋找一個提示或函數在xsl中,發現標籤後是否有空格,如果這是真的,函數應該做些什麼。用於LilyPond歌詞的XSL-Function

背景: 我想用XML寫歌曲的歌詞,因爲有各種各樣的音樂程序,它們需要特殊的語法來處理歌詞。

例如,軟件 「SongSheet發生器」 需要的語法:

[C]Where have all the [Am]flowers gone 

用於示出(和轉置)的C-的AM-Akkord。

沒問題標記C和很喜歡<akkord>C</akkord>,寫像

<xsl:template match="akkorde"> 
<span style="color:green">[<xsl:value-of select="." />]</span> 
</xsl:template> 

這麼久這麼好(我們在德國說)一個XSL。

現在我想在樂譜-PROGRAMM「LilyPond的」,歌詞這就需要這個語法工作:

Where4 have8 all2 the8 flow-8ers4 gone?2 

有了寫這篇文章,軟件知道,這個詞「去哪兒」是四分之一注意,「有」是1/8 ... (LilyPond將該詞設置在適當的音符下)

您會看到,「flowers」一詞與「 - 」分隔。這是因爲這個詞有兩個音符(或兩個音節)。

在這種背景下(在LilyPond的,每一個點,逗號,問號......是音節的持續時間之前設置),我想我寫這樣的XML:

<akkord>C</akkord>Where<duration>4</duration> have<duration>8</duration> all<duration>2</duration> the<duration>8</duration> <akkord>Am</akkord>flow<duration>8</duration>ers<duration>4</duration> gone<duration>2</duration> 

現在我需要一個XSL函數,在「flow-8ers4」中設置Seperator /連字符( - ),如果持續時間標籤在單詞中。如果duration-Tag在「Where4」這個單詞的末尾,那麼不應該出現Seperator。

我以爲「如果duration-Tag之後沒有空格,那麼它必須在該單詞中,然後該函數應該在持續時間標籤之前放置分隔符/連字符( - )」。 但你在上面看到歌詞末尾有一個問號。所以功能也必須看,如果第一個符號是空格或點,逗號...

當然,我也可以標記分隔符。但那是更多的工作要做。我希望一個功能可以使這個更好/更快。

希望你能理解我的寫作。感謝提示。

回答

0

XSLT沒有看到標籤,它只看到元素節點。編寫爲<duration>4</duration>的元素有兩個標籤,一個開始標籤和一個結束標籤。現在要理解你的問題,我需要看看你的意思是什麼,「標籤」這個詞,我認爲你的意思是「元素節點」。

可以測試當前元素節點是否後面緊跟着與一組特定的使用測試的字符中的一個開始文本節點:

<xsl:if test="following-sibling::node()[1][self::text()[translate(substring(.,1,1), ' ?!.,:;()', '') = '']"/> 

在XSLT 2。0您可以使用正則表達式概括測試:一個字符

matches(., '^\W') 

測試是否是一個「無字」的字符(一大類的標點字符,分隔符和符號)。

這是否完全滿足您的要求很難說。例如,我不清楚在duration元素之後緊跟着另一個元素節點而不是文本節點時會發生什麼情況。