使用 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>
<?xml version="1.0" encoding="UTF-8"?>
<returns>
<num_returns>4</num_devoluciones>
<list_returns>
<return>
<id_ret>111</id_ret>
<return>
<id_ret>222</id_ret>
</return>
<return>
<id_ret>333</id_ret>
</return>
<return>
<id_ret>444</id_ret>
</return>
</return>
</list_returns>
</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 您必须分两步完成此操作:
提取转义的 XML,例如使用此模板
<xsl:template match="//ns1:out">
<xsl:value-of select="normalize-space(.)" disable-output-escaping="yes" />
</xsl:template>
备注:
- 您不能像上面那样在转义的 XML 上使用
xsl:for-each
。
disable-output-escaping
并非由所有 XSLT 处理器实现,因为这是可选的。如果它根本不起作用,这可能就是原因。
- 您的转义 XML 格式不正确。最后一个
</return>
是错误的,num_returns
以 num_devoluciones
结束。其中还有其他错误,因此在继续第 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>
我正在调用嵌入响应 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>
<?xml version="1.0" encoding="UTF-8"?>
<returns>
<num_returns>4</num_devoluciones>
<list_returns>
<return>
<id_ret>111</id_ret>
<return>
<id_ret>222</id_ret>
</return>
<return>
<id_ret>333</id_ret>
</return>
<return>
<id_ret>444</id_ret>
</return>
</return>
</list_returns>
</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 您必须分两步完成此操作:
提取转义的 XML,例如使用此模板
<xsl:template match="//ns1:out"> <xsl:value-of select="normalize-space(.)" disable-output-escaping="yes" /> </xsl:template>
备注:
- 您不能像上面那样在转义的 XML 上使用
xsl:for-each
。 disable-output-escaping
并非由所有 XSLT 处理器实现,因为这是可选的。如果它根本不起作用,这可能就是原因。- 您的转义 XML 格式不正确。最后一个
</return>
是错误的,num_returns
以num_devoluciones
结束。其中还有其他错误,因此在继续第 2 步之前必须对输出进行清理。
- 您不能像上面那样在转义的 XML 上使用
再次转换输出以提取您想要的元素:
<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>