-1

我有以下xml:

<ns0:Root xmlns:ns0="http://root" xmlns:nm="http://notroot">
  <nm:MSH>
    <content>bla</content>
  </nm:MSH>
  <ns0:Second>
    <ns0:item>aaa</ns0:item>
  </ns0:Second>
  <ns0:Third>
    <ns0:itemb>vv</ns0:itemb>
  </ns0:Third>
</ns0:Root>

这是我的预期结果:

<Root xmlns="http://root" xmlns:nm="http://notroot">
  <nm:MSH>
    <content>bla</content>
  </nm:MSH>
  <Second>
    <item>aaa</item>
  </Second>
  <Third>
    <itemb>vv</itemb>
  </Third>
</Root>

我需要编写一个执行该映射的 xslt 1.0。

我真的不知道该怎么做,因此看起来很简单。

有人可以帮忙吗?

4

2 回答 2

1

将元素从xmlns:ns0="http://root"命名空间移动到默认命名空间。利用:

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

http://root默认命名空间添加xmlns="http://root"到样式表声明中。

因此,您可以尝试这样的事情:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:ns0="http://root" 
    xmlns="http://root" 
    exclude-result-prefixes="ns0" >
    <!-- Identity transform (e.g.  http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <!-- match root element and fore notroot namespace to this -->
    <xsl:template match="/*">
        <Root xmlns:nm="http://notroot">
            <xsl:apply-templates select="@*|node()" />
        </Root> 
    </xsl:template>


    <xsl:template match="content">
        <content>
            <xsl:apply-templates select="@*|node()" />
        </content>
    </xsl:template>
     <!-- move attributes with prefix ns0 to default namespace -->
    <xsl:template match="@ns0:*">
        <xsl:attribute name="newns:{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

     <!-- move elements with prefix ns0 to default namespace -->
    <xsl:template match="ns0:*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="node()|@*"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>
于 2013-07-01T10:20:07.170 回答
0

您的输入和输出之间的唯一区别是content内部元素nm:MSH已从无命名空间移动到http://root命名空间中。这可以通过带有调整的身份转换来处理:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
      xmlns:ns0="http://root">

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

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

</xsl:stylesheet>
于 2013-07-01T10:00:45.283 回答