2008-08-26 18 views
13

XML文書を変換したい。次のコード行が動作していない動的要素名

<ElementList> 
    <NewTag2007/> 
    <NewTag2006/> 
    <NewTag2005/> 
</ElementList> 

<xsl:element name="{concat('NewTag',Element/Year)}"/> 

を出力するシリーズです私はにそれを変えたい

<svc:ElementList> 
    <svc:Element> 
     <Year>2007</Year> 
    </svc:Element> 
    <svc:Element> 
     <Year>2006</Year> 
    </svc:Element> 
    <svc:Element> 
     <Year>2005</Year> 
    </svc:Element> 
</svc:ElementList> 

:ソースXMLは次のようになります次のような要素があります。< NewTag> "//エレメント/年"

(...スペースなし)"./Element/Year"、および"// SVC:エレメント/年"どちらか動作しません。 1つの複雑さは、「年」タグがデフォルト名前空間にある間に、「要素」タグが「svc」名前空間にあることです。

とにかく、私は名前空間の問題に直面しているのですか、または「concat()」関数を誤って使用していますか?

+0

うれしいことに、解決策が機能すること。しかし、一般的には、実行時に実行時にタグ名を作成しないようにすることをお勧めします(ただし動作​​します)。私はより静的な方法でXML TAG構造を理解しています。私の解決策は次のようなものです:のような静的XMLタグをそのような属性で取得します。あなたはXSLTとXPathで "element [year =" 2007 "]を使ってそれにアクセスすることができますので、柔軟性を失うことはありませんが、セキュリティと一貫性を得るには... – Sauer

答えて

12

おそらく名前空間に問題があり、現在のコンテキストに問題がある可能性があります。ソースについて(追加された名前空間宣言は、それが整形式のXMLを作るために)

<svc:ElementList xmlns:svc="svc"> 
    <svc:Element> 
    <Year>2007</Year> 
    </svc:Element> 
    <svc:Element> 
    <Year>2006</Year> 
    </svc:Element> 
    <svc:Element> 
    <Year>2005</Year> 
    </svc:Element> 
</svc:ElementList> 

スタイルシート

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:svc="svc" 
       version="1.0"> 
    <xsl:template match="svc:ElementList"> 
    <xsl:element name="{local-name()}"> 
     <xsl:for-each select="svc:Element"> 
     <xsl:element name="{concat('NewTag', Year)}"/> 
     </xsl:for-each> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

はあなたが必要アウトプットが得られます。接頭辞namespaceを使用してsvc:Elementを選択する必要があり、新しいタグを生成する際のコンテキストがではなくsvc:Elementであることに注意してください。

+0

FYI、concatでparamsを参照する必要がある場合は、 '{concat {'a'、$ myParam、 'c'}}'を使用します。 – raffian