2016-04-04 149 views
0

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

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

我正在寻找在一个单一的xslt即两个这些任务。寻找标签,加密它,发送请求(带有加密标签,如果存在的话)到网址。

<?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> 

回答

0

,所以如果你真的使用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> 
+0

DataPower在这方面是一个奇怪的鸭子。该处理器是XSLT 1.0,只是有足够的例外来混淆每个人。其中一个例外就是它*自动将结果片段转换为节点集转换,所以Martin的XSLT 2.0代码应该可以在DataPower上运行。 – bjimba

+0

虽然上面的xslt并没有在datapower上抛出任何语法错误,但这不是我正在寻找的。我希望执行加密的第二个xsl的输出成为将输入请求发送到指定URL的第一个xsl的输入。 在Datapower中,我使用了两个xsl转换动作,我可以通过使用INPUT和OUTPUT上下文轻松完成此操作。但是在这里我想用一个单一的xsl转换来完成,因此只需要一个xslt。 – anky316

+0

@ anky316,我改变了片段,因为我误解了你想要的内容,以前的建议会将第一个样式表的结果作为第二个样式表的输入。由于所有的代码似乎都是特定于数据的,我无法测试,所以试试看。 –