1

XML である名前空間から別の名前空間に移動していますが、型指定された要素の xsi:type 属性に関する問題に直面しています。ある名前空間を持つ要素を別の名前空間に簡単に移動する次のテンプレートを使用しています。

   <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 属性として更新することはできません。

   <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>

上記の例では、「nsold:atype」を、新しい名前空間を使用する「ns3New:atype」のようなものに変更できません。この種の値を調整する方法はありますか?

4

2 に答える 2

1

これを行う「正しい」方法は、おそらく、xsi:type を type attribute(*, xs:QName) として認識するスキーマ認識変換を使用することです。次に、以下で補足された恒等変換を行うことができます

<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>

f:new-prefix() は、QName の名前空間 URI を新しいドキュメントで使用されるプレフィックスにマップする関数です。

ただし、xsi:type が名前空間に依存する唯一のコンテンツである場合は、それを特別なケースとして扱うことができます。

于 2011-07-05T10:00:11.407 に答える
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:etc' に置き換えます。代わりは。

于 2011-07-05T09:52:00.587 に答える