具有命名空间操作的一对一XSLT映射

时间:2013-07-01 09:55:11

标签: xslt xslt-1.0

我有以下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。

我真的不知道怎么做,所以看起来很简单。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>