我想使用xslt在xml文件中添加“xmlns”属性

时间:2010-07-27 07:04:15

标签: xslt attributes xml-namespaces using

我想跟随xml文件输出:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
- <INTERFACE>
  <NAME>SAFER</NAME> 
  <VERSION>04.02</VERSION> 
  </INTERFACE>

为此我有以下xslt文件:  

<xsl:template match="T0020" >
    <xsl:copy>
    <xsl:attribute name="xsi:schemaLocation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd </xsl:attribute>

  //some code here...............//

 <xsl:copy>

所以我在<T0020>标签下添加xmlns =“http://www.safersys.org/namespaces/T0020V1”属性

2 个答案:

答案 0 :(得分:2)

此转化

<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:variable name="vDefaultNS"
  select="'http://www.safersys.org/namespaces/T0020V1'"/>

 <xsl:template match="*">
  <xsl:element name="{name()}" namespace="{$vDefaultNS}">
   <xsl:copy-of select="namespace::* | @*"/>
   <xsl:apply-templates/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时

<T0020 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd"
>
 <INTERFACE>
  <NAME>SAFER</NAME>
  <VERSION>04.02</VERSION>
 </INTERFACE>
</T0020>

产生想要的结果

<T0020 xmlns="http://www.safersys.org/namespaces/T0020V1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd">
   <INTERFACE>
      <NAME>SAFER</NAME>
      <VERSION>04.02</VERSION>
   </INTERFACE>
</T0020>

请注意 xmlns不是属性,而是表示命名空间声明。

答案 1 :(得分:1)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="T0020">
        <xsl:element name="{name()}" namespace="http://www.safersys.org/namespaces/T0020V1">
            <xsl:attribute name="xsi:schemaLocation">http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd</xsl:attribute>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

使用此输入:

<T0020>
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
</T0020>

输出:

<T0020 xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
</T0020>

注意:命名空间节点不是属性节点。如果您希望没有名称空间中的元素在某个名称空间下输出,则需要xsl:element/@namespace