14

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)}"/>

出力は、 < NewTag >のような一連の要素です。(スペースなしで...)

"//Element/Year""./Element/Year"、および"//svc:Element/Year"も機能しません。複雑な点の 1 つは、「Element」タグが「svc」名前空間にあり、「Year」タグがデフォルトの名前空間にあることです。

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

4

1 に答える 1

13

おそらく名前空間の問題であり、現在のコンテキストの問題である可能性があります。ソースの場合(整形式の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

于 2008-08-26T13:12:30.917 に答える