将空xmlns添加到选择性子节点

时间:2013-11-13 10:23:09

标签: xslt

我有一个XML:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance">
    <Body>
        <reinstateAccountRequest xmlns="http://abc.xyx/">
            <serviceRequestContext>
                <a>t</a>
                <b>t</b>
            </serviceRequestContext>
            <reinstateAccountInput>
                <a>t</a>
                <b>t</b>
            </reinstateAccountInput>
        </reinstateAccountRequest>
    </Body>
</Envelope>

我想将空xmlns添加到serviceRequestContextreinstateAccountInput节点

结果XML应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:p1="http://www.w3.org/2001/XMLSchema-instance">
    <Body>
        <reinstateAccountRequest xmlns="http://abc.xyx/">
            <serviceRequestContext xmlns="">
                <a>t</a>
                <b>t</b>
            </serviceRequestContext>
            <reinstateAccountInput xmlns="">
                <a>t</a>
                <b>t</b>
            </reinstateAccountInput>
        </reinstateAccountRequest>
    </Body>
</Envelope>

如何为此编写XSLT

1 个答案:

答案 0 :(得分:1)

您可以从构建XSLT身份模板开始,复制任何现有节点

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

有了这个,您只需编写要在其中更改节点的模板。在您的情况下,您希望更改 restoreateAccountRequest 元素的子元素,并且您需要进行的更改是创建具有相同名称但没有名称空间的新元素。

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

其中“abc”是一个名称空间前缀,它将被定义为具有与输入XML中相同的名称空间URI。

这是完整的XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://abc.xyx/">

   <xsl:output omit-xml-declaration="yes" indent="yes" />
   <xsl:template match="abc:reinstateAccountRequest//*">
      <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()"/>
      </xsl:element>       
   </xsl:template>

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