如何在 xslt 中将变量插入到元素的 and/or 属性值中

How to insert a variable into an element's and/or attribute´s value in xslt

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

例如:

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

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

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

预先感谢您的帮助,请随时要求澄清!

干杯,

杰斯珀

在 XSLT 3.0 中,设置 expand-text="yes" 并写入 VersionNumber='{$DocumentID}'.

在早期版本中写入 VersionNumber='<xsl:value-of select="$DocumentID"/>'

另请注意,xsl:element 在 version="2.0" 之前没有 type 属性,并且设置 type 属性没有意义,除非有xsl:import-schema 声明。

我最终以与 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>

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