【问题标题】:Dynamic Element Names动态元素名称
【发布时间】:2010-09-06 21:00:56
【问题描述】:

我想转换一个 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/Year""./Element/Year""//svc:Element/Year"也不行。一个复杂的问题是“Element”标签在“svc”命名空间中,而“Year”标签在默认命名空间中。

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

【问题讨论】:

  • 很高兴,该解决方案有效。但通常我会建议不要在运行时动态创建标签名称(尽管它有效!)。我以更静态的方式理解 xml TAG 结构。我的解决方案是:采用像 这样的静态 XML 标记。您仍然可以使用 XSLT 和使用“element[year="2007"] 的 XPath 访问它。因此您既不会失去灵活性,又可以获得安全性和一致性......只是一个想法。

标签: xml xslt namespaces


【解决方案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:Element需要使用命名空间前缀来选择,并且生成新标签时的上下文是svc:Element,而不是svc:ElementList

【讨论】:

  • 仅供参考,如果您需要在 concat 中引用参数,请使用 {concat{'a',$myParam,'c')}
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多