名前空間に依存しないことにするXSLTを変更
-
21-08-2019 - |
質問
私は、特定のXML文書を処理するために作成したXSLTを持っています。しかし、今の名前空間は、いくつかの中に導入されているが、私たちのドキュメントのすべてではありません。私はしかし、私は依存しない名前空間になるように、私のスタイルシートを変更するトラブルを抱えている、これらの文書に同じXSLTを使用するようにしたいと思います。
しかし考えると、我々はすでに、これは非常に労働集約的で、スタイルシートを作りました。
、*[local-name()="ElementName"]
ために私のXPathを変更するために、以前に示唆されています
また、私は、特定の名前空間にxpath-default-namespace
を設定することができます承知していますが、先に述べたように、私は単にそれが#ALLに設定または可能な名前空間のリストができません。私は、より効果的な解決策を探していると私にはサクソンプロセッサの拡張機能を用意しています。何か案は?おかげます。
解決
あなたのXML文書を前処理と考えることがありますか?
あなたはすべての名前空間を削除する(可能な衝突を意識する)し、既存のXSL変換を使用して、それを処理することができます。
このようなアプローチは、あなたがすべてであなたのXSLTを変更する必要がないという利点を持っているでしょう。これは、および保守性(そうひどい見えます* [ローカル名()= 'FROB'])読み込み可能なままです。
他のヒント
さらに協議した後、単に、このうちの簡単な方法はありませんようです。 XSLTは、名前空間に依存しないこと、またはxpath-default-namespace
要素に<xsl:stylesheet>
属性を使用するように再設計する必要があります。私たちが入ってくる文書の名前空間を保持したいが、まだ複数の名前空間を持つ1つのスタイルシートの仕事を持っている場合は、私たちのテンプレートは、以下のフォームに似ている必要があります:
<xsl:template match="*[local-name(.)='ElementName']">
<xsl:element name="{local-name(.)}" xmlns="http://yourURIhere">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template/>
など。
たぶん私はあなたの問題を理解していないが、あなたは自分のテンプレート(s)は、nullで名前空間のバージョンの要素のの名前空間バージョンの両方が一致していませんでしたか? - このように:
<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace">
... output ...
</xsl:template>
(典型的には、NSプレフィックスの宣言は、スタイルシート要素上に配置される)
この私には、これまでで最も「クリーン」バージョンである - 私はすべての3つのRSSフォーマット(0.91、1.0&2.0)単一のXSLTスタイルシートのプロセスを持っているために、これを使用してbeeenました。
。私は解決策を与えていないが、きれいに問題を提示する次のページを見つけます:
http://www.edankert.com/defaultnamespaces.htmlする
私はオライリー「一言でXML」でその問題の解決策を見つけます: