2016-06-12 11 views
0

私はXSLTの初心者です。私は長い間XMLを変換しようとしてきましたが、できませんでした。 入力XMLは、このようなものです:その値がversion 2ある場合xslt 1.0を使用してxmlの属性値の文字列を置き換えます。

<Load v:MajorVersion="05" v:MinorVersion="01" xmlns="version 2" xmlns:v="version 2"> 
    <annotation/> 
    <Header></Header> 
    <Body></Body> 
</Load> 

出力はversion 1version 2から属性xmlnsの値とxmlns:vを置き換える必要があり、そうでなければそのままにする必要があります。
問題は、属性が変更される傾向があり、入力xmlがxmlns:nまたはxmlns:mのようなものであるか、これらの属性が存在しない可能性があります。

最後に、我々は、ノードLoadのすべての属性を検索し、すべての属性で文字列を検索version 2(のxmlnsのように、のxmlns:V、のxmlns:nは、等)する必要があり をしてversion 1によって置き換えます。

私を助けてください。私を信頼してください。私は時間を費やして答えを見つけました。

答えて

0

あなたの属性は名前空間宣言です。したがって、「名前空間のURLを変更する方法」を見てください。

あなたはこのような何かを試すことがあります。

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:v2="version 2"> 
    <xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
    <xsl:strip-space elements="*"/> 
    <xsl:template match="@*|node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="node()"/> 
      </xsl:copy> 
    </xsl:template> 

    <xsl:template match="v2:*"> 
     <xsl:element name="{local-name()}" xmlns="version 1"> 
       <xsl:apply-templates select="node()|@*"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@v2:*"> 
    <xsl:attribute name="{local-name()}" xmlns="version 1"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet 
+0

私は上記の解決策を見ました。問題は、名前空間の修飾子が動的であること、v2、pidx、その他のものである可能性があることです。また、値が "version 2"である複数の名前空間宣言が存在する可能性があります。目的は "バージョン2"から "バージョン1"へのすべての名前空間宣言を置き換えることです –

+0

あなたは同じ名前空間uriの名前空間接頭辞について話しています。彼らは問題ではありません。 xsltにはxmlと同じである必要がないユニークなプレフィックスだけが必要です。上記のテンプレートを試してみてください。 –

0

あなたがいないソースXMLの観点から、XPathデータモデルの観点で考える必要があります。 XMLフラグメントのデータモデルを理解している場合は、xmlns属性の値を変更したくない場合は、要素名と属性名の名前空間部分を変更することをお勧めします。つまり、名前が同じローカル名であるが、古い要素/属性とは異なる名前空間URIを持つ新しい要素/属性を作成したいとします。だからあなたは指示を欲しいです

<xsl:element name="name()" namespace="...."/> 
<xsl:attribute name="v:majorVersion" namespace="...."/> 
関連する問題