【问题标题】:Add Namespace Prefix To root node将命名空间前缀添加到根节点
【发布时间】:2013-03-21 17:47:40
【问题描述】:

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

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

谢谢, 湿婆

【问题讨论】:

  • 在您的示例中,子元素已从 ...SportsbookCouchbase.xsd 命名空间更改为 NULL 命名空间。这是故意的吗?
  • 是的,先生,这是故意的。

标签: xml xslt namespaces prefix


【解决方案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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2011-04-28
    相关资源
    最近更新 更多