如何在xslt

时间:2019-05-07 14:16:27

标签: xml xslt soa bpel

我在BPEL中使用xslt将我的有效负载转换为Web服务的可接受格式,这是我使用的具有SQL命令的Web服务。现在,我的有效负载中有此元素,需要在搜索查询中使用该值。

例如:

<DocumentID>12341241123-124124-124124</DocumentID>

我想在SQL查询中使用此元素“ DocumentID”的值作为参数。在以下意义上:

        <?xml version="1.0" encoding="UTF-8" ?>
        <xsl:stylesheet version="1.0"

    <!-- a whole bunch of namespaces -->

           <xsl:template match="/">
              <xsl:for-each select="current()[string-length(DocumentID) >= $STRING_LENGTH]/DocumentID">
                 <xsl:element name="SearchRequest" type="SomeRequestType">
                 <xsl:element name="SearchScope" type="SomeStoreScope" 
                                   objectStore="SomeObjectStore"/>
                 <xsl:element name="SearchSQL">SELECT [Id] FROM Document WHERE
                                               VersionNumber ='{12341241123-124124-124124}'
                                               AND SecondStatement = true</xsl:element>
                 </xsl:element>
              </xsl:for-each>
           </xsl:template>
        </xsl:stylesheet>

但是,在前面的示例中,“ VersionNumber”是硬编码的。我希望这是我的有效负载中实际的“ DocumentID”元素所覆盖的参数。

xslt中是否有任何方法可以从现有的有效负载元素中获取值,并将其用作另一个元素的值。如果将变量插入所述元素的属性中怎么办?

有什么顺序吗?

         <xsl:element name="SearchSQL">SELECT [Id] FROM Document WHERE
                                       VersionNumber ='$DocumentID'
                                       AND SecondStatement = true</xsl:element>
         </xsl:element>

在此先感谢您的帮助,请随时进行澄清!

干杯

Jesper

2 个答案:

答案 0 :(得分:1)

在XSLT 3.0中,设置expand-text =“ yes”并输入SolutionB

在早期版本中,写SolutionA

还要注意,VersionNumber='{$DocumentID}'在version =“ 2.0”之前没有VersionNumber='<xsl:value-of select="$DocumentID"/>'属性,除非有{ {1}}声明。

答案 1 :(得分:0)

我最终以与迈克尔·凯(Michael Kay)的答案稍有不同的方式解决了这个问题,为了完整起见,我想将其包括在内:

<xsl:template match="/">
   <SearchRequest type="SomeRequestType" xmlns="http://www.w3.org/2001/XMLSchema-instance">
      <SearchScope type="SomeStoreScope" objectStore="SomeObjectStore"/>
      <SearchSQL>
         <xsl:text>SELECT [Id] FROM Document WHERE VersionNumber = </xsl:text>
         <xsl:value-of select="/Stuff/MoreStuff/DocumentID"/>
         <xsl:text> AND SecondStatement = true </xsl:text>
      </SearchSQL>
   </SearchRequest>
</xsl:template>

像这样完美地工作! 在另一种情况下,我想将变量DocumentID插入属性中,并按以下方式进行操作:

<Target>
   <xsl:attribute name="objectId">
     <xsl:value-of select="/Stuff/MoreStuff/DocumentID"/>
   </xsl:attribute>
   <xsl:attribute name="objectStore">
     <xsl:text disable-output-escaping="no">SomeObjectStore</xsl:text>
   </xsl:attribute>
</Target>

我希望这对某人有帮助! :)