2011-07-04 7 views
1

XML内である名前空間から別の名前空間に移動しています。タイプされた要素のxsi:type属性に問題がありました。 私はネームスペースが1つの要素を他のものに簡単に移動する次のテンプレートを使用しています。replace namespace - 名前空間を持つ属性の値に問題があります

<xsl:template match="ent:*" > 
    <xsl:element name="ent:{local-name()}" 
     namespace="http://ns3"> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

ただし、特定の名前空間に属する属性値をxsi:type属性として更新することはできません。新しい名前空間を使用しています:「ATYPE ns3New」のようなものに:「ATYPE nsoldを」

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <ser:getAsByIdResponse xmlns:ser="http://osde.com.ar/services"> 
    <return xmlns:xsi=".." xmlns:ns3New="http://ns3" xmlns:ns1New="http://ns2" xsi:type="nsold:aType"/> 
    </ser:getAsByIdResponse> 

    </soap:Body/> 

    </soap:Envelope> 

は、上記の例では、私は変更することはできません。 このような値を調整する方法はありますか?

+0

ソースXML文書とは何ですか、変換する必要があるXML文書は何ですか?答えようとしている人はなぜこれらを推測しなければならないのですか?質問を編集して不足しているデータを提供してください。 –

答えて

1

ここで問題となるのは、nsold:aTypeは属性のテキスト値です。名前空間はありません。テキストだけです。属性の内容を変更するテンプレートが必要です。あなたのニーズに適合させるために必要があるかもしれませんが、これはこれを行う方法を示すべき:

<xsl:template match="@*[starts-with(.,'nsold:')]"> 
    <xsl:attribute name="{name()}"> 
    <xsl:value-of select="concat('ns3New:',substring-after(.,'nsold:'))" /> 
    </xsl:attribute> 
</xsl:template> 

これ単にテキストはで始まると任意の属性の内容を代入し「nsold:」で「ns3New:。など」代わりに。

+0

XPath 1.0を使用している場合の属性の値タイプの適切な名前は、「文字値」ではなく「文字列値」です。仕様通り:http://www.w3.org/TR/xpath/#dt-string-value –

+0

まあ、それについて髪を分割しようとするなら、適切な名前は 'string-value'です(ハイフン)、私は属性の内容を記述していましたが、それは型の名前ではなく、実際には関係ありません。しかし、それを指摘してくれてありがとう。 – Flynn1179

1

これを行う「正しい」方法は、おそらくxsi:typeを型属性(*、xs:QName)として認識するスキーマ対応変換を使用することです。新しいプレフィックス()新しいドキュメントで使用する接頭辞へのQNameの名前空間URIをマップする機能である:あなたはその後、fは

<xsl:template match="attribute(*, xs:QName)"> 
    <xsl:attribute name="{local-name()}" namespace="{namespace-uri()}" 
    select="concat(f:new-prefix(namespace-uri-from-QName(.)), 
        ':', local-name-from-QName(.))"/> 
</xsl:template> 

を補っ恒等変換を行うことができます。

ただし、xsi:typeが唯一の名前空間に敏感なコンテンツである場合、特殊なケースとして扱うことができます。

+0

これはXSLT2プロセッサを使用していることに言及する価値があります。 – Flynn1179

関連する問題