2012-04-08 8 views
1

あなたは性質は、例えば、XML形式でXSLファイル

<Properties> 
    <Property value="abc">ABC1</Property> 
    <Property value="...">...</Property> 
</Properties> 

、ファイル保存している場合xsltを使用して(プロパティ、入力)XMLファイルを処理し、(入力xmlファイルの)abc要素を(カスタム出力xmlファイルの)ABC1などに置き換えることができます。例えば

何のプロパティは、その入力XMLファイルのタグに定義されていない場合は、入力XMLファイルの各タグのために定義されたプロパティからなるプロパティファイルで私の

入力XMLファイル以下
<?xml version="1.0" encoding="UTF-8"?> 
     <Content> 
      <abc>xxx 
       <def>zzz 
        <ghi>ccc</ghi>ttt 
        <dynamic val="hello" xmlns="http://abc.com" /> 
         world 
        <dynamic val="hi" xmlns="http://abc.com" /> 
         <dynAttr> 
         <dyn value=123 /> 
         <dyn value=222 /> 
         </dynAttr> 
         <lmn>data</lmn> 

        </def> 
       </abc> 
     </Content> 

を検討し、次に変換されたXMLタグました入力XMLファイルタグと同じタグ名。

<?xml version="1.0" encoding="UTF-8"?> 
<Properties> 
      <Property value="Content">CONTENT12</Property> 
      <Property value="abc">ABC1</Property> 
      <Property value="def">www</Property> 
       <Property value="ghi">yyy</Property> 
      <Property value="dynamic">Dynamic1</Property> 
      <Property value="dynAttr">DynAttribute</Property> 
</Properties> 

XSLTを使用してプロパティXMLファイルを参照し、変換されたXMLファイルで指定された入力XMLファイルと結果に適用された場合に示されるようにXSLファイルを書き込む

<?xml version="1.0" encoding="UTF-8"?> 

       <www>zzz 
        <yyy>ccc</yyy>ttt 
        <Dynamic1 val="hello" xmlns="http://abc.com>hello</Dynamic1> 
         world 
        <Dynamic1 val="hi" xmlns="http://abc.com>hi</Dynamic1> 
         <DynAttribute> 
         <dyn>123</dyn> 
         <dyn>222</dyn> 
         </DynAttribute> 
         <lmn>data</lmn> 
        </www> 
if the above code is my requirement then what must be the relative xpath expression in your answer <xsl:template match=" "> 
+0

:HIありませんあなたは上の質問 –

答えて

2

あなたの例のファイルではありませんうまく形成されていますが、prop.xmlであること、そしてあなたの財産ファイル修正した場合、これは動作するはずです:

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


<xsl:template match="*"> 
<xsl:variable name="n" select="name()"/> 
<xsl:variable name="new"> 
    <xsl:for-each select="document('prop.xml')"> 
    <xsl:choose> 
    <xsl:when test="key('n',$n)"> 
    <xsl:value-of select="key('n',$n)"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$n"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:element name="{$new}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
</xsl:element> 
</xsl:template> 

<xsl:key name="n" match="Property" use="@value"/> 

</xsl:stylesheet> 

あなたの質問は要素がであるべきと改名何の名前空間は言っていないABO。 veコードは常にそれらを名前空間に入れません。あなたがそれらを元の変更と同じ名前空間XSLになりたい場合は、次の

<xsl:element name="{$new}" namespace="{namespace-uri()}"> 

に要素ラインで最も柔軟な選択肢はおそらく、プロパティファイルでローカル名と名前空間URIの両方を指定することです。

更新

コメントやあなたが名前空間を維持し、のみ次のようにマイナーな変更をdef要素を処理したい更新の回答で述べたようにした場合:Maestro13 @

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


<xsl:template match="/"> 
<xsl:apply-templates select="//def"/> 
</xsl:template> 

<xsl:template match="*"> 
<xsl:variable name="n" select="name()"/> 
<xsl:variable name="new"> 
    <xsl:for-each select="document('prop.xml')"> 
    <xsl:choose> 
    <xsl:when test="key('n',$n)"> 
    <xsl:value-of select="key('n',$n)"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$n"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:element name="{$new}" namespace="{namespace-uri()}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
</xsl:element> 
</xsl:template> 

<xsl:key name="n" match="Property" use="@value"/> 

</xsl:stylesheet> 
+0

のための任意の解決策を持っていますあなたの応答のためにありがとうございます。私たちはコピーまたは任意のコピータグを使用するときには、必要な名前空間ではなく、入力XMLファイルに関連する別の名前空間を得るでしょう。 –

+0

上記のcopy-ofを使用した唯一の場所は属性をコピーすることです。あなたは、属性名を変更する必要性について何の示唆もしなかったし、ソースファイル内に名前空間がある場合、名前空間URIを使用して要素名をどのように一致させるか(接頭辞を無視するか、上記のようにあなたの質問を編集して名前空間の使用を示すなら、名前空間URIを無視してプレフィックスを含む名前に一致させます)。 –

+0

@ David Carlisle:ありがとう、コードは正常に動作していますが、正確に一致するものは分かります。これは、それが入力XMLの各ノードに一致することを意味します。 –