誰かが私に手を貸してくれることを願っています。この問題は私を数日間困惑させてきました。私の問題の根本は、2つの要素の間のドキュメント順にすべてのノードにマークアップを追加したいということです。
次のようなXMLを持つドキュメントがあります。
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
検索ヒットをマークアップするOracleの「マークアップ」関数を使用して、文字列「John Doe」を検索すると、次のようなXML結果が得られます。
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName><hitStart/>John</FirstName>
<LastName>Doe<hitEnd/></LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
これをヒットを強調するXHTMLに変換したいと思います。たとえば、次のXHTMLは有用な結果になります。
<TABLE>
<TR>
<TD>Mr. <b style="color:red">John Doe</b></TD>
<TR>
<TR>
<TD>Tom Doe</TD>
</TR>
</TABLE>
apply-templatesまたは名前付きテンプレートを使用してドキュメント内を移動するスタイルシートを作成しようとしましたが、機能させることができません。ノードがhitStart要素とhitEnd要素内にあるかどうかを示すパラメーターを渡すことができないため、apply-templatesの使用には注意が必要です。名前付きテンプレートの使用は、テキストノードと要素ノードを異なる方法で処理する必要があるため注意が必要です。これはXSLT1.0では実行できません。助けていただければ幸いです。
ありがとう、ブライアン
助けてくれたみんなに感謝します!!!! あなたたちは素晴らしいです!
これが私が決めたものです:
<xsl:template match="/*|node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="text()[preceding::*[self::hitStart or self::hitEnd][1][self::hitStart]
and following::*[self::hitStart or self::hitEnd][1][self::hitEnd]]">
<span style="color:red;font-style:italic;font-weight:bold"><xsl:value-of select="."/></span>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="hitStart|hitEnd">
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>