在XSLT中调用REST请求并仅整合响应部分元素的实现问题
嘿,我太懂你在XSL里整合REST响应时卡壳的烦躁了——用document()函数折腾半天没搞定确实让人头大。咱们一步步把这个问题捋顺,帮你把REST接口的数据顺利塞进转换后的XML里。
先搞定
document()函数的正确打开方式 其实document()本身是支持直接调用HTTP资源的,但你之前可能踩了几个小坑:
- 首先,你的REST URL里参数值的单引号是多余的!正常URL参数不需要用单引号包裹,正确的请求地址应该是:
http://server.loc.org/maxrest/rest/mbo/alndomain/?domainid=SKIPRSN,之前的单引号大概率导致接口返回错误,document()自然拿不到有效数据。 - 其次,得确认你用的XSL处理器支持HTTP请求——像Saxon、Xalan这类主流处理器没问题,但一些轻量版处理器可能不支持,先确保工具链是对的。
用变量存REST响应,再整合到结果里
给你一个可直接参考的示例代码,你可以根据自己的原XML结构和REST响应结构调整:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 把REST响应存储到变量里,注意去掉参数里的单引号 --> <xsl:variable name="restResponse" select="document('http://server.loc.org/maxrest/rest/mbo/alndomain/?domainid=SKIPRSN')"/> <xsl:template match="/"> <!-- 这里是你原XML转换的核心内容 --> <transformedResult> <!-- 保留原XML的转换逻辑,比如复制原节点 --> <originalContent> <xsl:copy-of select="."/> </originalContent> <!-- 从REST响应里提取需要的内容插入进来 --> <restIntegratedData> <!-- 假设REST响应结构是<alndomain><row><value>xxx</value></row></alndomain>,根据实际结构修改XPath --> <xsl:copy-of select="$restResponse//row/value"/> </restIntegratedData> </transformedResult> </xsl:template> </xsl:stylesheet>
这个逻辑很简单:先把REST接口返回的XML存到变量$restResponse里,之后就像操作普通XML一样用XPath提取你需要的节点,直接插入到转换后的结果中就行。
那些容易忽略的坑及解决办法
- 命名空间问题:如果REST接口返回的XML带命名空间,你得在XSL里提前声明对应的命名空间前缀,不然XPath会找不到节点。比如:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:max="http://www.ibm.com/maximo"> <xsl:variable name="restResponse" select="document('http://server.loc.org/maxrest/rest/mbo/alndomain/?domainid=SKIPRSN')"/> <!-- 用命名空间前缀查询节点 --> <xsl:copy-of select="$restResponse//max:row/max:value"/> </xsl:stylesheet> - 权限/跨域问题:如果REST接口需要认证,或者你的XSL运行环境有跨域限制,得给处理器配置认证信息。比如Saxon可以通过设置HTTP客户端参数添加
Authorization头,Xalan可能需要用扩展函数来处理认证逻辑。 - 缓存问题:有些XSL处理器会缓存
document()的请求结果,如果REST数据更新了但没拿到新内容,可以给URL加个随机参数(比如?domainid=SKIPRSN&t={时间戳})强制刷新。
最后提个小建议:先在浏览器或者curl里单独测试你的REST URL,确认能返回正常的XML,再放到XSL里调试——这样能快速排除是接口本身的问题还是XSL代码的问题。
内容的提问来源于stack exchange,提问作者PLynn
相关产品推荐
相关产品推荐

