假设我有一些xml:
<a>
<b>something</b>
<c>something</c>
<d>something</d>
</a>
我希望<a>
的所有子项都以x
命名空间为前缀。目前我有以下几点来实现这一目标:
<xsl:template match="a">
<a>
<xsl:apply-templates>
</a>
</xsl:template>
<xsl:template match="b">
<x:b><xsl:value-of select="." /></x:b>
</xsl:template>
<xsl:template match="c">
<x:c><xsl:value-of select="." /></x:c>
</xsl:template>
<xsl:template match="d">
<x:d><xsl:value-of select="." /></x:d>
</xsl:template>
这很有效,但很麻烦,我必须知道所有孩子的名字是什么。我知道match="*"
语法,但我不知道如何获取*
的名称,因此我可以在模板匹配中加上x
。有什么想法吗?
为了清楚起见,我希望用一个节点替换那些xsl:template
节点,这个节点将为任何节点名称添加前缀,其中一个节点名称包含x
命名空间。
答案 0 :(得分:2)
使用local-name(.)
获取节点的本地名称(即没有名称空间的名称),并使用xsl:element
创建具有该名称的元素。使用name(.)
作为属性。应用程序是这样的:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:z="http://example.com/z">
<xsl:template match="*">
<xsl:element name="z:{local-name(.)}">
<xsl:apply-templates select="@*|*|text()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name(.)}"><xsl:value-of select="."/></xsl:attribute>
</xsl:template>
</xsl:stylesheet>
编辑:添加属性模板。
答案 1 :(得分:2)
这个XSLT怎么样?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:x="mynamespace"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="*">
<xsl:element name="x:{name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>