动态元素名称

时间:2008-08-26 12:51:56

标签: xml xslt namespaces

我想转换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)}"/>

输出是一系列如下所示的元素:&lt; NewTag&gt; 。 (没有空格......)

“//元素/年份”“./元素/年份”“// svc:元素/年份”也不工作。一个复杂因素是“Element”标签位于“svc”命名空间中,而“Year”标签位于默认命名空间中。

所以无论如何,我是否面临命名空间问题,或者我错误地使用了“concat()”函数?

1 个答案:

答案 0 :(得分: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