websphere 变量_使用WebSphere DataPower上下文变量在样式表之间进行通信

websphere 变量

关于DataPower XML设备

您可以使用WebSphere DataPower SOA Appliances for XML来加速XML数据流的过滤,转换和保护。 基本配置可能会检查架构有效性,数字签名和入站消息的其他属性,然后将其传递到固定的后端。 更复杂的规则可能会解密入站消息,基于XML内容动态选择后端,将数据转换为其他格式等等。 在自定义XSLT中,DataPower扩展还提供有关入站连接的IP地址,端口号等信息,以用于记录或插入到出站消息中。

DataPower引擎的一项强大功能是使用上下文变量在处理步骤之间甚至在同一事务中的不同规则之间传递信息。 例如,您可以配置一个策略来捕获请求规则上的SOAP标头,并将该标头插入对原始客户端的响应中。 您可以使用相同的上下文变量机制来捕获自定义样式表中较早处理步骤的完整结果,或者访问前面提到的事务元数据。

本文将讨论如何使用dp:variable()<dp:set-variable/>扩展名来访问上下文和服务变量。 您还可以使用上下文变量来控制执行哪个样式表,调用哪个规则或将哪个输入用于以后的处理步骤。 如果仅在单个样式表中使用状态,则DataPower设备还提供样式表局部变量,该变量比传递XSLT模板参数更易于使用。

使用dp:variable()和<dp:set-variable />扩展

DataPower扩展元素/功能目录列出了设备上运行的样式表可用的所有XSLT扩展元素和功能。 在这些扩展中,有一个扩展函数dp:variable()和一个扩展元素<dp:set-variable/> 。 要使用这些扩展,样式表需要告知XSLT引擎dp: XML名称空间,并且该名称空间包含扩展元素。 通常也要求处理器不要在样式表的输出中包含该名称空间。 此设置发生在<xsl:stylesheet>最顶层的<xsl:stylesheet>元素中。

除了此处描述的扩展之外,给定固定的变量名称和固定的字符串值,处理策略中的setvar操作会将变量设置为该值。 然后可以使用dp:variable()在以后的样式表中对其进行访问。

上下文,上下文变量和系统变量

在DataPower处理策略配置中,每个步骤都有标记的输入和输出。 配置中提供的名称实际上是系统中上下文的名称。 上下文不仅存储​​数据(例如作为转换的输入或输出的XML树),而且还存储一组上下文变量 。 有一小组特殊的上下文,例如INPUT和OUTPUT引用当前规则的输入和输出数据,以及PIPE进行流转换。 否则,上下文集将在整个事务中持续存在,包括请求和响应规则以及任何可能被调用的被调用或错误规则。

每个变量都有一个名称,实际上是一个以var:开头的URL。 有四种可变语法:

  • var://context/contextname/varname varname在上下文中始终引用名为varname的变量contextname 。 作为一种特殊情况, var://context/contextname/_roottree是指存储在上下文中的实际数据,而不是其中的特定变量。
  • var://local/varname引用一个名为varname的变量。 如果设置变量,则在当前样式表的输出上下文中进行设置。 如果读取一个,则从输入上下文中读取。
  • var://system/contextname/varname指的是全局变量 。 可以使用与上下文变量几乎相同的方式来使用全局变量,但是它们的值将保留在当前事务之外。 全局变量难以安全使用,因为无法保护变量以免在单独的并发事务中进行更新,也无法在设备重启后持久保存变量的值。
  • var://service/property引用服务变量 。 您可以在扩展元素/功能目录的附录A中找到服务变量的完整列表。 例如,读取var://service/protocol检索当前请求的协议(“ http”,“ https”,等等)。

使用扩展

让我们将输入消息中的SOAP标头复制到响应中。 首先,我们需要提取我们感兴趣的SOAP标头,然后使用<dp:set-variable />将其保存到上下文变量中。 下面的样式表可以做到这一点:

清单1.提取一个SOAP头
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:tns="http://www.example.org/tns"
                xmlns:dp="http://www.datapower.com/extensions"
                extension-element-prefixes="dp"
                exclude-result-prefixes="dp">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <dp:set-variable name="'var://local/header'"
                     value="/soap:Envelope/soap:Header/tns:MyHeader"/>
    <xsl:copy-of select="/"/>
  </xsl:template>
</xsl:stylesheet>

请注意,声明了dp: XML名称空间前缀,并将其引用为扩展元素前缀-显式dp:元素应作为扩展处理,而不是复制到输出中-并且该前缀应从样式表的结果中排除。 我们在包含我们感兴趣的标头的XSLT节点集的任何输出上下文中都设置了一个名为header的变量,然后还将输入的全部内容复制到该上下文中。 如果一个转换动作配置了一个INPUT的输入上下文和一个saved的输出上下文,那么saved上下文将包含输入树,以及一个我们感兴趣的带有SOAP标头的附加header变量。该策略如图2所示。 1。

图1.调用“ get SOAP header”样式表的处理策略配置
图1.调用“ get SOAP header”样式表的处理策略配置

您可以使用dp:variable()扩展功能来检索响应规则中变量的内容。 像任何其他XPath函数一样调用此函数。 因为我们希望它的值是一个节点集,所以我们将从<xsl:copy-of/>语句中调用它,以将其值插入结果中,如清单2所示。

清单2.插入一个保存的SOAP标头
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:tns="http://www.example.org/tns"
                xmlns:dp="http://www.datapower.com/extensions"
                extension-element-prefixes="dp"
                exclude-result-prefixes="dp">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <soap:Envelope>
      <soap:Header>
        <xsl:copy-of select="/soap:Envelope/soap:Header/*"/>
        <xsl:copy-of select="dp:variable('var://context/saved/header')"/>
      </soap:Header>
      <xsl:copy-of select="/soap:Envelope/soap:Body"/>
    </soap:Envelope>
  </xsl:template>
</xsl:stylesheet>

此样式表显式引用了请求规则中的“已保存”上下文,因此可以将其配置为将INPUT作为其输入,将OUTPUT作为其输出。 由于这是作为响应规则运行的,因此它将从后端服务读取其输入,并将其输出写入对初始前端连接的响应。

作为调试工具,DataPower探针可用于查看已保存的变量。 图2显示了使用此策略通过设备发送示例XML文件之后,探针如何显示变量列表。 因为可以从任何其他样式表访问上下文变量,所以探针将这些变量视为“全局”。

图2.具有上下文变量的DataPower XI50探针
图2.具有上下文变量的DataPower XI50探针

动态生成的样式表和动态选择的输入

在处理策略配置中出现上下文名称或目标URL的大多数地方,可以使用上下文变量名称代替。 如果上下文变量包含字符串,则该变量的值将解释为事物的名称。 例如,将处理步骤的输入设置为var://context/context/input ,将在context上下文中查看input变量。 如果该变量设置为ctx1 ,则从ctx1变量获取步骤的输入。 更典型的用法是设置上下文变量以保存样式表的URL,然后在转换操作中使用上下文变量名称作为样式表名称来动态选择要运行的样式表。

清单3显示了如何根据输入消息的SOAP版本,将该技术应用于选择不同的样式表。 样式表查看输入消息,然后根据其根元素的名称选择适合于处理SOAP 1.1或1.2消息的样式表。 然后将处理策略配置为首先运行此样式表,然后运行由var://context/stylesheet/name

清单3.根据SOAP版本选择样式表
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
                xmlns:tns="http://www.example.org/tns"
                xmlns:dp="http://www.datapower.com/extensions"
                extension-element-prefixes="dp"
                exclude-result-prefixes="dp">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <xsl:apply-templates mode="pick-stylesheet"/>
    <xsl:copy-of select="/"/>
  </xsl:template>
  <xsl:template match="/soap11:Envelope" mode="pick-stylesheet">
    <dp:set-variable name="'var://context/stylesheet/name'"
                     value="'local:///soap-1.1.xsl'"/>
  </xsl:template>
  <xsl:template match="/soap12:Envelope" mode="pick-stylesheet">
    <dp:set-variable name="'var://context/stylesheet/name'"
                     value="'local:///soap-1.2.xsl'"/>
  </xsl:template>
  <xsl:template match="*" mode="pick-stylesheet">
    <xsl:message terminate="yes">Unrecognized SOAP envelope</xsl:message>
  </xsl:template>
</xsl:stylesheet>

如果仅通过文档root元素上的version属性之类的信息来了解特定的架构变体,则也可以使用上下文变量来为验证操作命名架构。 通过将上下文变量用作调用操作的目标规则名称,可以基于输入中的内容动态调用规则。

另一种有趣的设置是在转换操作中提供上下文名称而不是URL作为样式表名称。 在这种情况下,该上下文的内容将用作样式表,而不是获取固定的样式表。 您可能会使用它来基于未知输入为<xsl:key/>填写样式表中的XPath表达式,或者通过输入在实际样式表中设置固定的元素名称。 请注意,您需要使用<xsl:namespace-alias/>指令从XSLT生成XSLT。 有关更多信息,请参见XSLT 1.0规范的 7.1.1节。

使用dp:local-variable()和<dp:set-local-variable />扩展

XSLT变量是不可变的:一旦变量通过<xsl:variable/><xsl:param/>获取值,就无法更改。 要在一个模板中计算要在另一个模板中使用的值,必须在模板调用中通过一长串参数将其传递。

DataPower用户已使用上下文变量机制在单个样式表中提供可变状态。 在同一变量名称上多次调用<dp:set-variable/>会导致该变量的值被覆盖,因此编写了样式表,这些样式表使用上下文变量保存了一个值,以供在同一样式表中的其他位置使用,而无需使用XSLT参数。 但是,跟踪这些上下文变量所需的簿记可能很重要,并且以这种方式设置的任何变量都将持续存在,直到事务结束为止(可能在响应规则运行之后)。

为了满足在单个样式表中提供可变状态的需求,DataPower设备提供了类似的<dp:set-local-variable/>dp:local-variable()扩展。 它们的工作方式与<dp:set-variable/>dp:variable() ,但有两个区别:局部变量始终引用特定于当前样式表执行的值,并且它们可以具有任何字符串作为名称。

局部变量的一种有趣用途是实现一个将某些键映射到某个值的表,该值以后可以在同一样式表中进行更新。 注意,到目前为止,我们在所有示例中都使用了XPath字符串语法。 实际上,您可以使用任何解析为字符串的XPath表达式作为变量名。 清单4演示了这种技术:匹配一个kvp (键-值对)元素将设置一个局部变量,该局部变量的名称是从key子元素派生的,并将其设置为value元素的子元素,而tns:lookup()函数将获得与命名键对应的值。

清单4.在查询表中使用局部变量
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:tns="http://www.example.org/tns"
                xmlns:dp="http://www.datapower.com/extensions"
                xmlns:func="http://exslt.org/functions"
                extension-element-prefixes="dp func"
                exclude-result-prefixes="dp func">
  ...
  <xsl:template match="tns:kvp">
    <dp:set-local-variable name="concat('key:',tns:key)" value="tns:value/*"/>
  </xsl:template>
  <func:function name="tns:lookup">
    <xsl:param name="key" select="''"/>
    <func:result select="dp:local-variable(concat('key:',$key))"/>
  </func:function>
  ...
</xsl:stylesheet>

摘要

DataPower扩展提供了用于样式表之间通信的强大功能。 值或XML树可以在一个样式表中计算,保存并在另一个样式表中使用,可能在同一事务的返回路径上。 您还可以使用上下文变量来动态选择样式表,或将一个步骤的输出用作下一个样式表。


翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/0708_maze/0708_maze.html

websphere 变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值