2009-06-17 9 views
0

私は使用中のさまざまな名前空間と検証するためのスキーマを持つXML文書を持っています。スキーマでは、すべての要素が「修飾」されている必要があります。これは、名前空間がnullでない完全なQNameを持つ必要があると仮定していると仮定します。デフォルトの名前空間を持つノードの選択

しかし、この巨大なXML文書のいくつかの要素は、デフォルトの名前空間だけを使用していますが、この文書の場合は空白です。ネイティブでは、スキーマの検証に失敗します。

名前空間を持たないノードを選択し、他のノードと同じ接頭辞を持つ特定のノードを割り当てるXSLTを作成しようとしています。たとえば:

<x:doc xmlns:x="http://thisns.com/"> 
    <x:node @x:property="true"> 
    this part passes validation 
    </x:node> 
    <node property="false"> 
    this part does not pass validation 
    </node> 
</x:doc> 

私は、文書のルートノードにxmlns="http://thisns.com/"を追加しようとしたが、これはスキーマ・バリデータと一致しません。どのように私はこの仕事をすることができますか?

ありがとうございます!

答えて

2
<!-- Identity transform by default --> 
<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 
<!-- Override identity transform for elements with blank namespace --> 
<xsl:template match="*[namespace-uri() = '']">  
    <xsl:element name="{local-name()}" namespace="http://thisns.com/"> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:element> 
</xsl:template> 
<!-- Override identity transform for attributes with blank namespace --> 
<xsl:template match="@*[namespace-uri() = '']"> 
    <xsl:attribute name="{local-name()}" namespace="http://thisns.com/"><xsl:value-of select="."/></xsl:attribute> 
</xsl:template> 

これはと同様の結果得られます:第二<ノード>は、名前空間接頭辞なしたままであること

<x:doc xmlns:x="http://thisns.com/"> 
    <x:node x:property="true"> 
    this part passes validation 
    </x:node> 
    <node xp_0:property="false" xmlns="http://thisns.com/" xmlns:xp_0="http://thisns.com/"> 
    this part does not pass validation 
    </node> 
</x:doc> 

注意が、それは今ためのxmlnsの同じ名前空間の一部と見なされます=属性。

関連する問題