Как вставить переменную в значение элемента и / или атрибута в xslt - PullRequest
0 голосов
/ 07 мая 2019

Я использую xslt в своем BPEL, чтобы преобразовать мою полезную нагрузку в принятый формат для веб-службы, которую я использую и которая содержит команду SQL.Теперь у меня есть этот элемент в моей полезной нагрузке, значение которого мне нужно использовать в моем поисковом запросе.

Например:

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

Заранее спасибо за помощь, пожалуйста, не стесняйтесьпросить разъяснений!

Приветствия,

Jesper

Ответы [ 2 ]

1 голос
/ 07 мая 2019

В XSLT 3.0 установите параметр расширения-текст = "да" и напишите VersionNumber='{$DocumentID}'.

. В более ранних выпусках пишите VersionNumber='<xsl:value-of select="$DocumentID"/>'

. Обратите внимание также, что xsl:element не имеетtype атрибут до версии = "2.0", и что нет смысла устанавливать атрибут type, если нет объявления xsl:import-schema.

0 голосов
/ 21 мая 2019

Я решил исправить это немного иначе, чем ответ Майкла Кея, и я хочу включить его для завершения:

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

Надеюсь, это кому-нибудь поможет!:)

...