使用 XSLT 检索转义 XML 和取消转义

Retrieve escaped XML and unescape using XSLT

我正在调用嵌入响应 XML 转义 XML 的 Web 服务。

我收到了完整的 SOAP 响应,但我只对转义的 XML 感兴趣。 我想在转义的 XML 中获取信息并把它放在一些标签中。

Web 服务的响应:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
           xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
    <ns1:getListReturnsResponse xmlns:ns1="http://services.ws.zzz">
        <ns1:out>
            &lt;?xml version="1.0" encoding="UTF-8"?>
            &lt;returns>
                &lt;num_returns>4&lt;/num_devoluciones>
                &lt;list_returns>
                    &lt;return>
                        &lt;id_ret>111&lt;/id_ret>
                    &lt;return>
                        &lt;id_ret>222&lt;/id_ret>
                    &lt;/return>
                    &lt;return>
                        &lt;id_ret>333&lt;/id_ret>
                    &lt;/return>
                    &lt;return>
                        &lt;id_ret>444&lt;/id_ret>
                    &lt;/return>
                    &lt;/return>
                &lt;/list_returns>
            &lt;/returns>
        </ns1:out>
    </ns1:getListReturnsResponse>
</soap:Body>

有了这个响应,我想获取转义XML中的信息。

我正在使用的 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://services.ws.zzz">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

<xsl:template match="//ns1:out">
    <xsl:value-of select="." disable-output-escaping="yes" />
        <output-parms>
            <num-returns-out><xsl:value-of select="num_returns/text()"/></num-returns-out>
        </output-parms>
</xsl:template>

有了这个,我需要在 XML 的 num_returns> 标签中返回结果,如下所示:

<output-parms>
    <num-returns-out>4</num-returns-out>
</output-parms>

请帮帮我!! ;)

感谢大家

使用 XSLT-1.0 您必须分两步完成此操作:

  1. 提取转义的 XML,例如使用此模板

    <xsl:template match="//ns1:out">
        <xsl:value-of select="normalize-space(.)" disable-output-escaping="yes" />
    </xsl:template>
    

    备注:

    1. 您不能像上面那样在转义的 XML 上使用 xsl:for-each
    2. disable-output-escaping 并非由所有 XSLT 处理器实现,因为这是可选的。如果它根本不起作用,这可能就是原因。
    3. 您的转义 XML 格式不正确。最后一个 </return> 是错误的,num_returnsnum_devoluciones 结束。其中还有其他错误,因此在继续第 2 步之前必须对输出进行清理。
  2. 再次转换输出以提取您想要的元素:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
    
      <xsl:template match="/returns">
        <output-parms>
            <num-returns-out><xsl:value-of select="num_returns/text()"/></num-returns-out>
        </output-parms>
      </xsl:template>
    
    </xsl:stylesheet>
    

    输出为:

    <output-parms>
      <num-returns-out>4</num-returns-out>
    </output-parms>
    

如果您可以使用 XSLT-3.0 处理器,您可以使用 XPath-3.0 parse-xml function 并轻松一步完成:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://services.ws.zzz">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />

    <xsl:template match="//ns1:out">
        <xsl:variable name="innerXML" select="parse-xml(.)" />
        <xsl:element name="output-parms">
            <xsl:copy-of select="$innerXML/returns/num_returns" />
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>