仅在根节点中添加前缀NS0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仅在根节点中添加前缀NS0相关的知识,希望对你有一定的参考价值。

他是谁,

请帮我!我只需要在XML的第一个节点中包含名称空间前缀,其他节点必须没有前缀和名称空间。请参阅下面的示例。

之前:

<RootNode xmlns="https://xxx/yyy/v1">
<CreatedBy>admin</CreatedBy>
<Task>
<Number>1</Number>
<Status>-1</Status>
<Name>Fechada</Name>
</Task>
</RootNode>

后:

<ns0:RootNode xmlns:ns0="https://xxx/yyy/v1">
<CreatedBy>admin</CreatedBy>
<Task>
<Number>1</Number>
<Status>-1</Status>
<Name>Fechada</Name>
</Task>
</ns0:RootNode>

我怎么能用XSL做到这一点?

答案

你有两件事要做。

1)向根元素添加名称空间前缀。这可以使用以下模板完成

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

2)对于所有其他元素,创建具有相同名称但没有名称空间的元素。这可以通过以下方式完成

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

将这一切放在一起,使用身份模板处理其他所有内容,为您提供以下XSLT

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

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

  <xsl:template match="/*">
    <xsl:element name="ns0:{local-name()}" namespace="{namespace-uri()}">
      <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的主要内容,如果未能解决你的问题,请参考以下文章

将命名空间添加到根元素

如何在 XmlDocument 中的所有 XmlElements 中强制使用前缀? [复制]

如何使用 XSLT 删除特定前缀

如何使用 XDocument 添加 xml 前缀?

删除 XSLT 映射生成的元素的名称空间前缀

如果模型仅在根模块中,如何注入模型