2017-09-23 5 views
0

私の英語のために申し訳ありません。 xslのヒントや関数を探しています。タグの後ろにスペースがあるかどうかを調べ、これが真であれば関数は何かを作成する必要があります。LilyPondの歌詞のXSL関数

背景: 歌詞を扱うための特別な構文が必要なさまざまなMusik-Programmsがあるので、私はXMLの歌詞を書きたいと思っています。

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

示す(および転置)C- AM-Akkord用:

たとえば、ソフトウェア "SongSheetジェネレータ" 構文を必要とします。

<akkord>C</akkord>のようにCとアムをタグ付けし、(私たちはドイツで言う)とても良いので、長い

<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 

、ソフトウェアは単語が「どこ」の四半期であることを、知っています"have"は1/8です... (LilyPondは適切な注釈の下に単語を設定します)

"flowers"という単語は " - "で区切られています。これは、単語に2つの音符(または2つの音節)があるためです。 (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> 

今私は、単語にdurationタグがない場合は、 "flow-8ers4"にセパレータ/ハイフン( - )を設定するXSL関数が必要です。 duration-Tagが "Where4"のような単語の最後にある場合は、セパレータは表示されません。

私は、「duration-Tagにスペースがない場合は、単語内にある必要があり、その後、durationタグの前にセパレータ/ハイフン( - )を置く必要があります」と考えました。 しかし、上には、歌詞の最後に疑問符があることがわかります。したがって、最初の記号がスペースまたはポイントであれば、関数も見なければなりません。

もちろん、セパレーターにタグを付けることもできます。しかし、それはそうするためにもっとうまくいく。私は、関数がより速く/より速くそれを行うことができることを望む。

あなたは私の文章を理解することを願っています。ヒントをありがとう。

答えて

0

XSLTではタグが表示されず、要素ノードのみが表示されます。 <duration>4</duration>と書かれた要素には、開始タグと終了タグの2つのタグがあります。あなたの質問を理解するために、私はあなたが "タグ"という言葉の意味を理解する必要があります。私はあなたが "要素ノード"を意味すると思います。

現在の要素ノードは、直ちに試験を使用して文字の特定のセットのいずれかで始まるテキスト・ノードが続いているかどうかをテストすることができる:XSLT 2で

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

。文字は「非単語」の文字(句読点、セパレータ、および記号の広いクラス)であるかどうかを

matches(., '^\W') 

テスト:0あなたは正規表現を使用してテストを一般化することができます。

これがあなたの要件を完全に満たすかどうかは分かりにくいですか?たとえば、duration要素の直後にテキストノードではなく別の要素ノードが続くとどうなるかはわかりません。

関連する問題