动态元素名称
时间:2020-03-05 18:43:16 来源:igfitidea点击:
我想转换一个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)
<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。