1

我有一个 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>

我想向xmlnsserviceRequestContext节点reinstateAccountInput添加空

结果 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

4

1 回答 1

1

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

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

有了这个,你只需要在你想要对节点进行更改的地方编写模板。在您的情况下,您想要更改reinstateAccountRequest元素的子元素,并且您需要进行的更改是创建具有相同名称但没有命名空间的新元素。

<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>
于 2013-11-13T12:20:18.783 回答