添加命名空间前缀到根节点

时间:2013-03-21 17:47:41

标签: xml xslt namespaces prefix

我需要更改根节点的名称空间,并将名称空间前缀仅添加到根元素而不是子元素。

我有以下XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Class xmlns="https://api.ladbrokes.com/v1/sportsbook-couchbase/SportsbookCouchbase.xsd">
<blurb >Test</blurb>
<channels >
<e >I</e>
<e >J</e>
<e >K</e>
</channels>
<classSortCode >Test</classSortCode>
<classStatus >Test</classStatus>
<creationDateTime >2013-03-21T22:29:01.58+05:30</creationDateTime>
<isActive >true</isActive>
<lastUpdatedDateTime >2013-03-21T22:29:01.58+05:30</lastUpdatedDateTime>
<locale >Test</locale>
</Class>

我需要这个才能成为

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:Class xmlns:ns0="https://api.ladbrokes.com/v1/sportsbook-couchbase/Temp.xsd">
<blurb >Test</blurb>
<channels >
<e >I</e>
<e >J</e>
<e >K</e>
</channels>
<classSortCode >Test</classSortCode>
<classStatus >Test</classStatus>
<creationDateTime >2013-03-21T22:29:01.58+05:30</creationDateTime>
<isActive >true</isActive>
<lastUpdatedDateTime >2013-03-21T22:29:01.58+05:30</lastUpdatedDateTime>
<locale >Test</locale>
</ns0:Class>

我可以使用XSLT实现这一目标吗?请在这方面帮助我。

谢谢, 西瓦

1 个答案:

答案 0 :(得分:1)

这就是为文档元素提供不同命名空间并将所有其他元素移动到空命名空间的方法:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns0="https://api.ladbrokes.com/v1/sportsbook-couchbase/Temp.xsd">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

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

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

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

在样本输入上运行时,结果为:

<ns0:Class xmlns:ns0="https://api.ladbrokes.com/v1/sportsbook-couchbase/Temp.xsd">
  <blurb>Test</blurb>
  <channels>
    <e>I</e>
    <e>J</e>
    <e>K</e>
  </channels>
  <classSortCode>Test</classSortCode>
  <classStatus>Test</classStatus>
  <creationDateTime>2013-03-21T22:29:01.58+05:30</creationDateTime>
  <isActive>true</isActive>
  <lastUpdatedDateTime>2013-03-21T22:29:01.58+05:30</lastUpdatedDateTime>
  <locale>Test</locale>
</ns0:Class>

为了澄清这一点,您可以更改文档元素的命名空间,并将其他所有内容保留在已有的命名空间中。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns0="https://api.ladbrokes.com/v1/sportsbook-couchbase/Temp.xsd">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

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

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

这就是结果。请注意顶部名称空间声明中的小但重要的区别:

<ns0:Class xmlns:ns0="https://api.ladbrokes.com/v1/sportsbook-couchbase/Temp.xsd" 
     xmlns="https://api.ladbrokes.com/v1/sportsbook-couchbase/SportsbookCouchbase.xsd">
  <blurb>Test</blurb>
  <channels>
    <e>I</e>
    <e>J</e>
    <e>K</e>
  </channels>
  <classSortCode>Test</classSortCode>
  <classStatus>Test</classStatus>
  <creationDateTime>2013-03-21T22:29:01.58+05:30</creationDateTime>
  <isActive>true</isActive>
  <lastUpdatedDateTime>2013-03-21T22:29:01.58+05:30</lastUpdatedDateTime>
  <locale>Test</locale>
</ns0:Class>