0

私はXSLに比較的慣れていません。特殊文字 (BasicLatin コード ブロックの外側にあるもの) を特定の方法で処理する必要があります。エンティティ コードとリテラル文字が基本的に同じであることは理解していますが、そのようには見えないテキスト エディターで作業する必要があります (それは私の制御範囲外です)。したがって、リテラル文字を保持することはオプションではありません。可能であれば、Perl やその他のメカニズムではなく、XSL でこれを処理したいと考えています。ここに私が持っているものがあります:

<p>This is a story&#x2014;a long story.</p>

これは私の望ましい結果です:

<p>This is a story<0x2014>a long story.</p>

次のような正規表現を使用してこれを実行しようとしています。

<xsl:value-of select="replace(., '(\P{IsBasicLatin})', 'concat('&lt;0x', string-to-codepoints($1), '&gt;'))"/>

しかし、数値リテラルの後に区切り記号が必要であるというエラーが表示されます。私が理解しているそのエラーのドキュメントを見つけることができませんでした。置換の一部として関数を使用しようとする試みに関連していますか? そのようなことはXSLで許可されていますか? そうでない場合は、提案を歓迎します。ここで提供されている回答を確認しました: convert character if codepoint within given range、これは関連しているように見えましたが、私にとってはうまくいきませんでした (最初のものは特殊文字を消去し、2番目のものは非常に奇妙な出力を与えます)。

どんな助けでも大歓迎です。関数またはコードポイントのいずれかについて何かが欠けていると思いますが、自分で少し壁にぶつかりました。ありがとう!

4

2 に答える 2

1

生成しようとしている出力は整形式の XML ではないため、XSLT は生成を許可しません。どの XML パーサーも受け付けない出力を生成してもよろしいですか?

コードの実際の問題は、concat の呼び出しを一重引用符で囲んでいることです。あなたが記述した式は、文字列リテラル 'concat(' の後に演算子 < が続き、その後に整数リテラル 0 が続き、その後に名前 x が続きます。これは有効な XPath 構文ではありません。

于 2012-07-03T07:08:13.557 に答える