1

xslt仕様を見ると、文字マップがドキュメント全体に適用されているようですが、特定のノードまたはテンプレート内で使用することも可能ですか?

例 : ルックアップ値を含むノードがありますが、別のテンプレートで使用すると、正規表現でうまく機能しない文字がノードに含まれている可能性があります。今のところ、うまく機能する置換機能を使用していますが、数文字後には、読み取りや維持がかなり難しくなります。だから私はこのようなものを持っている場合:

<xsl:variable name="myLookup" select="
replace(
replace(
replace(
replace(
string-join(/*/lookup/*, '|'),
'\[','\\['),
'\]','\\]'),
'\(','\\('),
'\)','\\)')
"/>

以下の架空の例のようなものを達成する方法はありますか?

<xsl:character-map name="escapechar">
    <xsl:output-character character="[" string="\[" />
    <xsl:output-character character="]" string="\]" />
    <xsl:output-character character="(" string="\(" />
    <xsl:output-character character=")" string="\)" />
</xsl:character-map>

<xsl:variable name="myLookup" select="string-join(/*/lookup/*, '|')" use-character-map="escapechar"/>

これがまったく機能していないことはわかっています。リクエストを少し視覚化するためです。

何か案が ?

4

2 に答える 2

1

文字マップはシリアル化機能にすぎません。つまり、変換の最終出力が生成されるときにのみ実行されます。ただし、現在のコードを大幅に簡素化できます。

使用するだけです:

replace($pStr, '(\[|\]|\(|\))','\\$1')

完全な例を次に示します。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:value-of select="my:escape(.)"/>
 </xsl:template>

 <xsl:function name="my:escape" as="xs:string">
  <xsl:param name="pStr" as="xs:string"/>

  <xsl:value-of select="replace($pStr, '(\[|\]|\(|\))','\\$1')"/>
 </xsl:function>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<t>([a-z]*)</t>

必要な正しい結果が生成されます。

\(\[a-z\]*\)
于 2013-05-19T16:22:10.833 に答える
1

XSLT 2.0 の文字マップは、結果ツリーがファイルまたはストリームにシリアル化されるときに適用されるシリアル化機能だと思うので、変換中に特定の文字列または特定のノードに適用する方法がわかりません。

正規表現パターンのメタ文字のエスケープについては、おそらくhttp://www.xsltfunctions.com/xsl/functx_escape-for-regex.htmlが役立ちます。

于 2013-05-19T12:46:24.737 に答える