7

特定の xml ドキュメントを処理するために作成した XSLT があります。ただし、現在、一部のドキュメントで名前空間が導入されていますが、すべてのドキュメントではありません。これらのドキュメントに同じ XSLT を使用したいのですが、スタイルシートを名前空間に依存しないように変更するのに苦労しています。

xpaths を に変更することが以前に提案され*[local-name()="ElementName"]ましたが、すでにスタイルシートを作成していることを考えると、これは非常に手間がかかります。

さらにxpath-default-namespace、特定の名前空間に を設定できることは承知していますが、前述のように、単純に #all または可能な名前空間のリストに設定することはできません。より効果的なソリューションを探しており、Saxon プロセッサの拡張機能を利用できます。何か案は?ありがとう。

4

4 に答える 4

3

XML 文書の前処理を検討したことがありますか?

すべての名前空間を削除して (競合の可能性に注意してください)、既存の XSL 変換を使用して処理することができます。

このようなアプローチには、XSLT をまったく変更する必要がないという利点があります。それは読みやすく (*[local-name()='frob'] はひどいように見えます)、保守可能です。

于 2009-02-04T18:22:26.017 に答える
1

さらに協議した結果、これを簡単に解決する方法はないようです。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/>

于 2009-02-03T19:17:05.110 に答える
1

私はあなたの問題を理解していないかもしれませんが、テンプレートをnull名前空間バージョン要素の名前空間バージョンの両方に一致させることはできませんか? - このような:

<xsl:template match="ElementName | NS:ElementName" xmlns:NS="your-namespace">
   ... output ...
</xsl:template>

(通常、NS プレフィックスの宣言はスタイルシート要素に配置されます)

これは私にとって最も「クリーンな」バージョンです。私はこれを使用して、1 つの XSLT スタイルシートで 3 つの RSS 形式 (0.91、1.0、および 2.0) すべてを処理しています。

于 2009-02-07T00:28:50.627 に答える
0

次のページで問題をうまく提示していることがわかりましたが、解決策はありません。

http://www.edankert.com/defaultnamespaces.html

そして、O'Reilly の「XML in a Nutshell」でその問題の解決策を見つけました。

http://docstore.mik.ua/orelly/xml/xmlnut/ch08_10.htm

于 2010-12-17T15:15:40.630 に答える