質問
XMLドキュメントを変換したいと考えています。ソース XML は次のようになります。
<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>
それを次のように変換したいと思います。
<ElementList>
<NewTag2007/>
<NewTag2006/>
<NewTag2005/>
</ElementList>
次のコード行は機能しません。
<xsl:element name="{concat('NewTag',Element/Year)}"/>
出力は次のような一連の要素です。 <新しいタグ>. 。(スペースは入れずに…)
"//要素/年", 「./要素/年」, 、 そして "//svc:要素/年" 働かないでください。複雑な点の 1 つは、「Element」タグが「svc」名前空間にあるのに対し、「 Year」タグはデフォルトの名前空間にあることです。
とにかく、名前空間の問題に直面しているのでしょうか、それとも「concat()」関数の使い方を間違っているのでしょうか?
解決
おそらく名前空間の問題と、現在のコンテキストに関する問題が考えられます。ソースの場合 (整形式の 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>
必要な出力が得られます。ご了承ください svc:Element
接頭辞付きの名前空間を使用して選択する必要があり、新しいタグを生成するときのコンテキストは次のとおりです。 svc:Element
, 、 ない svc:ElementList
.
所属していません StackOverflow