题
我想转换 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)}"/>
输出是一系列如下所示的元素: <新标签>. 。(没有空格...)
“//元素/年份”, “./元素/年份”, , 和 “//svc:元素/年份” 也不行。一个复杂之处是“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
.
不隶属于 StackOverflow