繁体   English   中英

使用xslt替换根节点的xmlns属性

[英]Replace xmlns attribute of root node using xslt

我有像下面的xml

<rnp xmsns="v1">
  <ele1 line="1">
    <ele2></ele2>
  </ele1>
</rnp>

我想把它改成

<rnp xmsns="v2">
  <ele1 line="1">
    <ele2></ele2>
  </ele1>
</rnp>

使用xslt 1.0。

我在xsl以下使用。

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns="v2">
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@*|*|node()"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="rnp">
        <rnp>
            <xsl:apply-templates select="*"/>
        </rnp>
    </xsl:template> 
</xsl:stylesheet>

但是这个xsl不会复制属性,因此不会在输出中生成line属性。

样本输出

<?xml version="1.0" encoding="UTF-8"?><rnp xmlns="v2"><ele1>1
        <ele2/>
      </ele1></rnp>

如何使用xslt仅更改xmlns attrbiute的文本? 有没有其他方法可以使用xslt更改xmlns? 我只能选择xslt 1.0。

谢谢。

这种转变

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pNS" select="'v2'"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*[true()]">
  <xsl:element name="{local-name()}" namespace="{$pNS}">
       <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

当应用于提供的XML文档时 (更正为在命名空间"v1"创建它:

<rnp xmlns="v1">
  <ele1 line="1">
    <ele2></ele2>
  </ele1>
</rnp>

产生想要的,正确的结果

<rnp xmlns="v2">
   <ele1 line="1">
      <ele2/>
   </ele1>
</rnp>

请注意

  1. 所需的新默认命名空间作为外部参数传递给转换 - 因此,在必须修改默认命名空间的每种情况下,都可以使用没有任何修改的smae转换。

  2. 这个看似不寻常的模板匹配: <xsl:template match="*[true()]">如果我们将其编码为<xsl:template match="*"> ,则可以避免XSLT处理器出现”可恢复的歧义错误“消息<xsl:template match="*">并且比指定优先级更短更优雅。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns="v2">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

输出:

<rnp xmlns="v2">
    <ele1 line="1">
        <ele2 />
    </ele1>
</rnp>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM