当前位置: 首页 > 知识库问答 >
问题:

用XSLT:CDATA拦截器映射xml

陆正德
2023-03-14

我一直在尝试使用XSLT从以下xml文件中获取元素“测试”的内容,但我真的被阻止了。

您知道如何使用XSLT获取它吗

XML文件内容如下所示:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Body>
      <BusinessResponse>
         <BusinessResult><![CDATA[<?xml version="1.0" encoding="UTF-8"?><test>helloWorld</test>]]></BusinessResult>
      </BusinessResponse>
   </soap:Body>
</soap:Envelope>

共有2个答案

周浩博
2023-03-14

试着这样做:

<xsl:value-of select="BusinessResult" disable-output-escaping="yes"/>
刘意
2023-03-14

使用XSLT 3.0,您可以使用parse-xml()函数将文本解析为xml,然后可以通过XPath将其转换到结构中,以获得

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <xsl:output omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">
    <xsl:sequence select="parse-xml(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult)/test"/>
  </xsl:template>

</xsl:stylesheet>

使用XSLT 1.0或更高版本,如果您的内容真的那么简单,并且只希望文本节点位于

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

  <xsl:template match="/">
    <xsl:value-of 
        select="substring-before(
                  substring-after(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult,
                     '&lt;test>'), 
                  '&lt;/test>')" />            
  </xsl:template>

</xsl:stylesheet>

如果您需要能够执行更复杂的操作,并且需要XSLT和XPath的全部功能,那么您可以通过两种转换来实现这一点。通过使用xsl:value ofdisable output escaping=“yes”,将BusinessResulttext()序列化为XML的第一个转换:

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

  <xsl:template match="/">
    <xsl:value-of select="/soap:Envelope/soap:Body/BusinessResponse/BusinessResult" disable-output-escaping="yes" />            
  </xsl:template>

</xsl:stylesheet>

它产生:

<?xml version="1.0" encoding="UTF-8"?><test>helloWorld</test>

如果您希望在处理SOAP信封时将其与其他XML结构一起使用,则可能需要排除XML声明:

substring-after(/soap:Envelope/soap:Body/BusinessResponse/BusinessResult,'?>')

然后使用第二个XSLT从XML输出中选择和处理您想要的内容

 类似资料:
  • 主要内容:映射拦截动作,参考Struts 2的开发者用来声明行为属于一个包,扩展 “struts-default“, 其中包含默认设置的拦截。 拦截器的默认设置进行分组为“defaultStack”在struts-default.xml文件中,它位于 struts2-core.jar 文件,“defaultStack”提供所有的核心Struts2功能,这是最适合应用的需要。 试着学习struts-default.xml文件,

  • easyopen在1.3.1版本开始支持拦截器。 easyopen拦截器实现原理跟springmvc拦截器类似,拦截器作用在api方法上,即有@Api注解的方法。 拦截器定义如下: /** * 拦截器,原理同springmvc拦截器 * @author tanghc * */ public interface ApiInterceptor { /** * 预处理回调方法,

  • 你可以配置处理器拦截器HandlerInterceptors或web请求拦截器WebRequestInterceptors等拦截器,并配置它们拦截所有进入容器的请求,或限定到符合特定模式的URL路径。 在MVC Java编程配置下注册拦截器的方法: @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigure

  • Uragano里可以自定义拦截器,并且拦截器分服务器端拦截器和客户端拦截器 拦截器还分全局拦截器和局部拦截器,并且拦截器也是支持依赖注入的 创建拦截器 public class ClientGlobalInterceptor : InterceptorAbstract { private ILogger Logger { get; } public

  • 问题内容: 我有一个流程,在CXF客户端上我安装了拦截器,提供程序和异常映射程序。就我而言,我正在通过拦截器捕获来自客户端的不良响应,然后我想中止cxf总线链并引发故障。不幸的是我做不到,因为在每种情况下都只记录从拦截器抛出的异常,但是主要错误(错误的json格式)会传播到异常映射器。我想避免使用异常映射器,但是我不知道怎么做。我正在使用WebClient来实现这样的拦截器: 我读到我应该实现ja

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器