如何为节点中的所有元素添加命名空间?

时间:2014-05-28 22:56:30

标签: xslt

假设我有一些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命名空间。

2 个答案:

答案 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>
相关问题