用xslt去除肥皂ENV和BODY

时间:2014-08-20 21:11:29

标签: xml xslt soap

所以我有一个看起来像这样的请求......

<Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsd="http://www.w3.org/2001/XMLSche## Heading ##ma"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.xmlsoap.org/soap/envelope/"
>
<Body>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:tem="http://tempuri.org/"
>
<soap:Body>
<tem:Login>
<tem:username>test</tem:username>
<tem:password>test</tem:password>
</tem:Login>
</soap:Body>
</soap:Envelope>
</Body>
</Envelope>

我需要让它看起来像这样......

<soap:Envelope
    xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
    xmlns:tem="http://tempuri.org/"
    >
    <soap:Body>
    <tem:Login>
    <tem:username>test</tem:username>
    <tem:password>test</tem:password>
    </tem:Login>
    </soap:Body>
    </soap:Envelope>

所以只需要删除第一个信封和身体。我正在考虑一些与此非常接近的代码,但这并不是很有效......

<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
>
  <xsl:output indent="yes" />

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

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

感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

简单的事情怎么样?

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="soap:Envelope">
    <xsl:copy-of select="." />  
</xsl:template>

</xsl:stylesheet>

或者,如果您愿意:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

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

</xsl:stylesheet>

请注意,soap:此处不是soap:

答案 1 :(得分:0)

试试这个,我得到了你想要的东西:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="*">
    <xsl:copy>
     <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*[name()='Envelope']|*[name()='Body']">
    <xsl:apply-templates/>
  </xsl:template>

</xsl:stylesheet>