5

この問題は、TEI マークアップ (www.tei-c.org) を使用するテキスト ドキュメントの書式設定で発生します。それは私の XSLT/XPATH スキルを超えています。(XSLT/XPATH 1.0 のソリューションが必要です。)

<lb>改行をマークするマークアップ要素 があります。属性を取ることができます@break。の場合、出力を生成するときに と周囲のテキスト@break="no"の間のスペースは無視されます。<lb>

そう

This little tea <lb break="no" />
pot, short and stout.

として理解されるべきである

This little teapot, short and stout.

つまり、「tea」の後のスペースと「pot」の前の改行は、出力ストリームでレンダリングされるべきではありません。

の前のスペースの場合<lb>、これは機能します。

<xsl:template match="text()[following-sibling::*[1][self::lb[@break='no']]">
    <!-- Do something about the space here. -->
</xsl:template> 

の後の改行でも同様のことが機能します<lb>

わかった。しかし、これはよりトリッキーです:

This <emph>little <ref>tea </ref> </emph>
<lb break="no" />
pot, short and stout.

要素内のテキスト<ref>は の兄弟ではなくなりました<lb>。また、 の前のスペース、前</ref>のスペース、前後</emph>の改行は<lb>すべて、出力ストリームから削除する必要があります。

どのように?

4

2 に答える 2

1

次のようなセレクターを試してください。

text()[matches(., '\S?\s*$') and not following::text()[matches('\S')] and following::lb[@break="no"]]

もちろん、これは恐ろしく非効率的です。しかし、うまくいくかもしれません。指摘されているように、matches() がないため、機能しません。私はもう一度やり直します:

OK、4 つの異なるシナリオを探しています。

  • スペースで終わる場合、最初の先行する空でないテキスト要素:

    lb[@break='no']/preceding::text()[normalize-space()!='' and string-length(substring-after(.,normalize-space()))!=0][1 ]

  • 最初の先行する空でないテキスト要素に続く空のテキスト要素:

    lb[@break='no']/preceding::text()[normalize-space()='' および先行::text()[normalize-space()!='']]

  • 次の最初の空でないテキスト要素の前にある空のテキスト要素:

    lb[@break='no']/following::text()[normalize-space()!='' and string-length(substring-before(.,normalize-space()))!=0][1 ]

  • スペースで始まる場合、空でないテキスト要素に続く最初の要素:

    lb[@break='no']/following::text()[normalize-space()='' and following::text()[normalize-space()!='']]

xpath 1.0 ではユニオンを使用できないため、このメソッドを使用して上記の各一致からテンプレートを呼び出す必要があります。

于 2012-04-12T17:22:02.887 に答える