2011-08-02 2 views
0

私は名前空間を特定できない顧客からのXMLを持っています。私はいくつかの属性の値を置き換える必要があります。ここで入力されたXMLの例です:属性値をXSLTを使用して不明な名前空間に置き換えます

<?xml version="1.0" encoding="UTF-8"?> 
<NetworkSection xmlns:ovf="http://com/deployment/1.0"> 
    <Network ovf:name="bridged"/> 
</NetworkSection> 

私はこのようなXMLを受信したい:

ここ
<?xml version="1.0" encoding="UTF-8"?> 
<NetworkSection xmlns:ovf="http://com/deployment/1.0"> 
    <Network ovf:name="VM network"/> 
</NetworkSection> 

私が使用しようとXSL:

<?xml version="1.0" encoding="utf-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" encoding="utf-8"/> 
    <xsl:template match="NetworkSection/Network/@*[local-name()='name']"> 
    <xsl:attribute name='name'>VM Network</xsl:attribute> 
    </xsl:template> 

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

問題はそのIであります属性名前空間を失う。 XSLで名前空間を定義することはできません。異なる入力XMLでは異なるため、属性値を変更したいだけです。

XSLで名前空間を指定せずにこのような置換を行うことはできますか? ありがとうございます。

答えて

0

これは、の名前()namespace-uri()の機能を使用することで実現できます。

<xsl:attribute name="{name()}" namespace="{namespace-uri()}">VM Network</xsl:attribute> 

あなたがXSLTでこのラインを使用する場合、あなたは

<Network ovf:name="VM network"/> 
+0

正常に動作します。どうもありがとう。 –

0

を望んで出力を取得する必要があります。この問題への私の好ましいアプローチは、2つのパス・ソリューションである:最初に、あなたの操作を行い、その後、名前空間を正規化"本当の"処理。これの利点は、パイプラインの正規化ステップを後続の処理が何であれ再利用できることと、後続の処理を常に容易にすることです。

関連する問題