0

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

我有以下 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 实现这一点吗?请在这方面帮助我。

谢谢,湿婆

4

1 回答 1

1

这就是您可以给文档元素一个不同的命名空间并将所有其他元素移动到 null 命名空间的方法:

<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>
于 2013-03-21T17:59:40.410 回答