【问题标题】:Combing these two xslts into one将这两个 xslt 合二为一
【发布时间】:2016-04-04 11:25:08
【问题描述】:

我有两个不同的 xslt 执行两个不同的任务。我需要创建一个执行这两项任务的 xslt。请参阅 bwloe 两个 xslt 的代码,并让 mw 知道它们是否可以组合成一个 xslt。

第一个 xsl 使用 dp url open 将请求发布到 url。第二个 xsl 在请求中搜索一个标签,如果该标签存在,该标签将被加密。

我希望在单个 xslt 中完成这两项任务,即。查找标签,对其进行加密,将请求(如果存在,则带有加密标签)发布到 url。

 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions" xmlns:env="http://schemas.xmlsoap.org/soap/envelope"
extension-element-prefixes="dp" exclude-result-prefixes="dp" version="1.0">

<xsl:template match="/">

    <xsl:variable name="result">
        <dp:url-open target="{$URL}" response="responsecode-ignore" ssl-proxy="BlankSSL" 
            data-type="xml" http-method="post" timeout="30">
            <xsl:copy-of select="." />
        </dp:url-open>
    </xsl:variable>
</xsl:template>

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dp="http://www.datapower.com/extensions" xmlns:env="http://schemas.xmlsoap.org/soap/envelope"
extension-element-prefixes="dp" exclude-result-prefixes="dp" version="1.0">




<xsl:template match="@*|node()">
<xsl:copy>
    <xsl:apply-templates select="@*|node()" />
</xsl:copy>


</xsl:template>


  <xsl:template match="/*[local-name()='Envelope']/*[local-name()='accountNumber']">
  <xsl:copy>
  <xsl:value-of select="dp:encrypt-string('http://www.w3.org/2001/04/xmlenc#tripledes-cbc','hex:1728289',/*[local-name()='Envelope']/*[local-name()='accountNumber'])"/>
  </xsl:copy>
  </xsl:template>

【问题讨论】:

    标签: xslt xslt-1.0 xslt-2.0 ibm-datapower


    【解决方案1】:

    您已将问题标记为 XSLT 2.0,因此如果您真的使用 XSLT 2.0 处理器,您可以简单地使用例如处理变量

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dp="http://www.datapower.com/extensions" xmlns:env="http://schemas.xmlsoap.org/soap/envelope"
    extension-element-prefixes="dp" exclude-result-prefixes="dp" version="1.0">
    
    <xsl:variable name="first-step">
       <xsl:apply-templates/>
    </xsl:variable>
    
    <xsl:template match="/">
    
        <xsl:variable name="result">
            <dp:url-open target="{$URL}" response="responsecode-ignore" ssl-proxy="BlankSSL" 
                data-type="xml" http-method="post" timeout="30">
                <xsl:copy-of select="$first-step" />
            </dp:url-open>
        </xsl:variable>
    
        <xsl:apply-templates select="$result/*"/>
    </xsl:template>
    
    
    <xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
    </xsl:template>
    
    
      <xsl:template match="/*[local-name()='Envelope']/*[local-name()='accountNumber']">
      <xsl:copy>
      <xsl:value-of select="dp:encrypt-string('http://www.w3.org/2001/04/xmlenc#tripledes-cbc','hex:1728289',/*[local-name()='Envelope']/*[local-name()='accountNumber'])"/>
      </xsl:copy>
      </xsl:template>
    

    【讨论】:

    • DataPower 在这方面是一只奇怪的鸭子。处理器是 XSLT 1.0,只有足够多的例外让每个人都感到困惑。其中一个例外是它确实执行自动结果片段到节点集的转换,因此 Martin 的 XSLT 2.0 代码应该可以在 DataPower 上运行。
    • 虽然上面的 xslt 没有在 datapower 上抛出任何语法错误,但这不是我想要的。我希望执行加密的第二个 xsl 的输出成为第一个 xsl 的输入,第一个 xsl 将输入请求发送到指定的 URL。在 Datapower 中,我使用了两个 xsl 转换操作,我可以通过使用 INPUT 和 OUTPUT 上下文轻松地做到这一点。但在这里我想使用单个 xsl 转换来做到这一点,因此使用单个 xslt。
    • @anky316,我已经更改了 sn-p,因为我误解了您想要的内容,并且之前的建议将第一个样式表的结果作为第二个样式表的输入。由于所有代码似乎都是特定于 datapower 的,我无法测试,所以你自己试试吧。
    • @MartinHonnen 它按预期工作。谢谢您的帮助。干杯!
    猜你喜欢
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2020-08-17
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    相关资源
    最近更新 更多