代码之家  ›  专栏  ›  技术社区  ›  JPLemme

动态元素名称

  •  13
  • JPLemme  · 技术社区  · 16 年前

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

    输出是一系列如下所示的元素: <纽塔格公司; . (没有空格…)

    “//元素/年” , “/element/年” “//svc:element/年” 也不要工作。一个复杂的问题是“element”标记在“svc”名称空间中,“year”标记在默认名称空间中。

    所以,不管怎样,我是要面对一个名称空间问题,还是我误用了“concat()”函数?

    1 回复  |  直到 11 年前
        1
  •  12
  •   jelovirt    16 年前

    可能是名称空间问题,也可能是当前上下文的问题。对于源(添加了命名空间声明以使其成为格式良好的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:元素 不是 svc:ElementList .