动态元素名称

Dynamic Element Names

提问人:JPLemme 提问时间:8/26/2008 最后编辑:Mathias MüllerJPLemme 更新时间:3/22/2014 访问量:24474

问:

我想转换 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”也不起作用。 一个复杂情况是,“Element”标记位于“svc”命名空间中,而“Year”标记位于默认命名空间中。

那么无论如何,我是面临命名空间问题还是我误用了“concat()”函数?

XML XSLT 命名空间

评论

0赞 Sauer 1/21/2016
很高兴,解决方案有效。但一般来说,我建议不要在运行时动态创建标签名称(尽管它有效!我以更静态的方式理解xml TAG结构。我的解决方案是:使用具有此类属性的静态 XML 标记,例如 <element year=“2007”>。您仍然可以使用 XSLT 和 XPath 以及 “element[year=”2007“] 访问它。因此,您既不会失去灵活性,又会获得安全性和一致性......只是一个 thoúght。

答:

13赞 jelovirt 8/26/2008 #1

可能是命名空间问题,也可能是当前上下文的问题。对于源(添加了命名空间声明,使其成为格式正确的 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:Elementsvc:Elementsvc:ElementList

评论

0赞 raffian 9/27/2012
仅供参考,如果您需要在 concat 中引用参数,请使用{concat{'a',$myParam,'c')}