2016-07-01 3 views
0

でノードの名前空間を取得し、私は得ることができますどのように私が持っている私は、XSLTで</p> <p>Suposse選択したノードの名前空間を抽出する必要がXSLT

<root xmlns:x1="url1" xmlns:x2="url2" ... xmlns:xN="urlN"> 
    <childNode1/> 
    ... 
    <childNodeN/> 
</root> 

<namespace node="root"> 
    <x1>url1</x1> 
    <x2>url2</x2> 
    ... 
    <xN>urlN</xN> 
</namespace> 

私は

試してみました
<xsl:template match="root"> 
    <namespace> 
     <xsl:attribute name="node"> 
      <xsl:value-of select="name()"/> 
     </xsl:attribute> 
     <xsl:for-each select="@*[contains(name(),'xmlns')]"> 
      <xsl:element name="{substring-after(name(),':')}"> 
       <xsl:value-of select="."/> 
      </xsl:element> 
     </xsl:for-each> 
    </namespace> 
</xsl:template> 

しかし、@*[contains(name(),'xmlns')]と一致しません。

助けが必要ですか?

ありがとうございます。

+0

あなたが好きなサポートやXSLT 2.0であれば、名前空間軸以降の機能を使用することができます 'スコープ内のプレフィックス、名前空間軸を置き換えることを意味しています()'。 –

答えて

2

現在のノードの名前空間を取得する必要があるときはいつでも、名前空間の軸を走査する必要があります。だから、

、あなたの例のためにこれを使用して...

<xsl:for-each select="namespace::*"> 
    <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:for-each> 

---編集

名前の値()あなたが使用できるように、デフォルトの名前空間のために空の文字列になりますxsl:ifまたはxsl:テストする時期。

<xsl:for-each select="namespace::*"> 
    <xsl:choose> 
    <xsl:when test="name()"> 
     <xsl:element name="{name()}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:when> 
    <xsl:otherwise> 
     <!-- handle default namespace here --> 

    </xsl:otherwise> 
    </xsl:choose>  
</xsl:for-each> 
+0

'という名前空間を出力する方法は、デフォルトの名前空間宣言' ...'。もちろん、名前空間の軸は使用できますが、別の出力形式が必要です。 –

+0

@MartinHonnen - もちろんあなたの絶対に正しい - テストはデフォルトの名前空間に必要ですが、ねえ!その質問に合った素早い答えで、正直に言うと、OPはちょっとしたリサーチだけで簡単に答えを見つけられました;-) –

+0

だから、どのようにデフォルトの名前空間宣言に一致させるのですか? – jechaviz

関連する問題