次の XSLT フラグメントは、最初と最後のテキスト ノードを特定の @audience 属性でラップ/タグ付けして強調表示するために使用されます。
<xsl:template match="text()">
<xsl:if test=". = ((((ancestor::*[contains(@audience,'FLAG_')])[last()])/descendant::text())[1])">
<xsl:call-template name="flagText"/>
</xsl:if>
<xsl-value-of select="."/>
<xsl:if test=". = ((((ancestor::*[contains(@audience,'FLAG_')])[last()])/descendant::text())[last()])">
<xsl:call-template name="flagText"/>
</xsl:if>
</xsl:template>
疑似コード:
フラグ基準に一致する最後の (最も近い) 祖先要素を見つけてから、その要素の子孫である最初と最後のテキスト ノードを見つけてフラグを立てます。
ロジックは正しいが、実装が間違っている。これは確かに最初と最後のテキストノードを見つけますが、ノードではなく値を照合しています。これは、最初または最後のノードと同じ値を持つテキスト ノードにフラグを立てます。
例:
The quick brown fox jumped over the lazy dog.
現在の出力:
[FLAG]The quick brown fox jumped over [FLAG]the lazy dog[FLAG].
[1] と犬の [last()] は適切にフラグが立てられていますが、最初の文字列と一致するか等しいため、途中で「the」という単語も検出されます。
編集:
期待される(望ましい)出力:
[FLAG]The quick brown fox jumped over the lazy dog.[FLAG]
最初と最後のノードのみに一致するようにステートメントを再編成するにはどうすればよいですか? 文字列を比較したくありません。最初と最後を選択したいだけです。
編集:
ソース XML の例
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
<concept audience="Users" id="concept_lsy_5vg_kl"><title>Product ABC</title><conbody><p>This is a blurb about <ph>Product ABC</ph>. Since the text in the phrase (ph) matches the text node in the title (first text node) it will be flagged. I only want the first and last nodes flagged. Basically, I don't want to compare the contents of the nodes. <ph audience="Users">I also need to support inline cases such as this one. </ph>I just want the flags before and after the first and last text nodes for each audience match.</p></conbody></concept>
XSLT の例
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" >
<xsl:output method="text" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="text()">
<xsl:if test=". = ((((ancestor::*[contains(@audience,'Users')])[last()])/descendant::text())[1])">
<xsl:text>[USERS]</xsl:text>
</xsl:if>
<xsl:value-of select="."/>
<xsl:if test=". = ((((ancestor::*[contains(@audience,'Users')])[last()])/descendant::text())[last()])">
<xsl:text>[/USERS]</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
電流出力
[USERS]製品 ABC これは、[USERS]製品 ABC に関する宣伝文句です。フレーズ (ph) のテキストは、タイトルのテキスト ノード (最初のテキスト ノード) と一致するため、フラグが立てられます。最初と最後のノードにフラグを付けたいだけです。基本的に、ノードの内容を比較したくありません。[USERS]このようなインライン ケースもサポートする必要があります。[/USERS]各オーディエンス マッチの最初と最後のテキスト ノードの前後にフラグが必要です。[/USERS]
望ましい出力 [USERS]製品 ABCこれは、製品 ABC に関する宣伝文句です。フレーズ (ph) のテキストは、タイトルのテキスト ノード (最初のテキスト ノード) と一致するため、フラグが立てられます。最初と最後のノードにフラグを付けたいだけです。基本的に、ノードの内容を比較したくありません。[USERS]このようなインライン ケースもサポートする必要があります。[/USERS]各オーディエンス マッチの最初と最後のテキスト ノードの前後にフラグが必要です。[/USERS]
ありがとう。