2009-03-10 7 views
7

XSL変換を処理するサーバーで名前空間のチェックが無効になっています(XSLを書き込んだユーザーが名前空間を認識しなかったため)。 XSLを変更する必要がありますが、名前空間が定義されていないため、テストできません。XSL変換中に名前空間を無視する方法はありますか?

代わりの

<xsl:template match="ns:element[position()=1]">... 

それはすべて、彼らはすべての名前空間で修飾しているので、それがXMLの要素のいずれにも一致しない

<xsl:template match="element[position()=1]">... 

を持っています。

アクセス権がないため、サーバーでテストできません。名前空間のチェックが有効にされなければならないため、他のすべての変換が破られるため、XSLを修正するのは無駄です。

私がする必要があることは、XSL変換中に名前空間を無視する方法を見つけることです。私はMSXML、XMLSpy(ここではオプションを見つけることができません)にアクセスできます。もし本当に必要なら、C#やそれに類する言語で何かをコード化することができます。詳細についてのコメントを受けて、私はいくつかの正規表現をコーディングすることができますが、私は本当に、特にXMLを扱うとき、そのルートを下るしたくない最後の手段として

...

これは、インスタンスのMethodeサーブレット(www.eidosmedia.com)を実行しているWindows 2003 Virtual Serverです。私は、このサーブレットがXSL変換を実行するためにどのような手法を使用するのか分かりません。彼らは、もともとXSLを書いた人がそれらを理解しておらず、それらをXSLに含めなかったので、名前空間を無視しています。したがって、すべてのXSLファイル(数百)には名前空間がありません。

これらのファイルをすべて一度に修正するのは興味深い課題かもしれませんが、それは私が今必要とするものではありません(そして、テストの量が関係しているので、私が知りたいのは、これらのXSLファイルをそのまま使用して、名前空間を考慮せずに対応するXML文書を変換するために使用できるツール(または技術)があるかどうかだけです。オリジナルのXSLを書いた人は、変身を自分自身でテストするために何か類似のものを使用していたに違いないので、ツールが存在しなければならないと私には思われます。

+0

サーバー上で名前空間のチェックを無効にするにはどうすればよいですか?そんなことは聞いたことがない。 –

+0

これは、変換を処理する第三者(MicrosoftまたはSunではない)の製品です。彼らは、開発者に無効にするオプションを与えるよう依頼しました。 – ilitirit

+0

詳細を入手できますか?どのようなタイプのサーバーなど、また、どのような問題が名前空間を無視して対処したいのですか?名前空間を無視することは非常に難しいので、問題の背後にある問題を知っていれば、代わりにその問題に取り組むことができます。 –

答えて

5

"実際の"変換の前に入力からすべての名前空間を削除するトランスフォームを実行します。しかし...もしあなたがなら、私は確信していません。それをしてください。それは醜い感じです。

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="*"> 
    <xsl:element name="{local-name()}" > 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

オリジナルの答え:

はそれはオプションでしょうか?

<xsl:template match="*[local-name()='element' and position()=1]">... 

(コメントがあったとして - それはないだろう)

+0

残念ながら。別のコメントに投稿したので、試合は単なる例でした。 「選択」機能もあります。 – ilitirit

+0

いくつかの作業が必要であるという事実は別として...なぜこれは機能しませんか? – Tomalak

+0

私はそれがうまくいかない理由を考えることができません。しかし、必要な作業量のために、私は名前空間を削除/挿入する正規表現を書いているかもしれません。私が知りたいのは、名前空間のない変換を可能にするツールがあるかどうかだけです。私はすでに仕事が必要な他の解決策を知っています。 – ilitirit

0

XMLでどのように多くの名前空間が存在するが、形質転換されますか?

1の場合、一時的にそのネームスペースをXSLのデフォルトネームスペースとして追加できますか?つまり、出力名前空間などを変更する必要があるかもしれないことを意味しますが、一度テストすればこれらの調整を取り除くことができます。

1より大きい値がある場合は、名前空間全体にローカル名の衝突がないことを意味します。すべてのエイリアスが同じ名前空間を指すようにテスト入力XMLを微調整し、上記の微調整を実行できますか?

+0

私は10個以上の名前空間を数えました(これはSpreadsheetMLファイルです)。私はすでに1つの入力ファイルから名前空間を削除しましたが、新しいファイルをテストするたびにそれを行う必要があるため、良い解決策ではありません。 – ilitirit

+0

よろしくお願いします。あなたが必要とするものを許可する、現代的な自己尊重のXSLプロセッサーを見つけることは疑わしいです。悲しいことに、RegExスクリプトはあなた自身の頼りになる可能性が高いと思います。 – AnthonyWJones

1

コメントとしては長すぎますので、私はこれを回答として投稿しています。

私が今まで聞いたことがないXSLTプロセッサでは、入力XMLの名前空間を無視することはできません。ネームスペースとそれを使用するXML文書を無視して記述されたXSL変換がある場合は、変換を行うために壊れたサーブレットを使用するか、XML文書を事前処理して名前空間を削除する必要があります。

Tomalakが投稿した変換はこれを行います。正規表現を使用するのとは異なり、XML内の他のすべてのものを取り締まることなく行います。そしてそれをすることはそれほど多くの仕事ではありません。チェイン変換は非常に簡単です。

関連する問題