Как вставить переменную в значение элемента и/или атрибута в xslt

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

Например:

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

Я хочу использовать значение этого элемента «ID документа» в качестве параметра в моем запросе 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» жестко задан. Я хочу, чтобы это был параметр, перезаписанный фактическим элементом «ID документа» из моей полезной нагрузки.

Есть ли способ в xslt взять значение из существующего элемента полезной нагрузки и использовать его в значении другого элемента как его часть. И как это сделать, если переменная должна быть вставлена ​​в атрибут указанного элемента?

Что-то в этом порядке?

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

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

Ваше здоровье,

Джеспер

См. xsl:value-of инструкция

Alejandro 07.05.2019 16:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 228
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В XSLT 3.0 установите expand-text="yes" и напишите VersionNumber='{$DocumentID}'.

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

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

Большое спасибо, Майкл. У меня есть один вопрос: что, если целью является атрибут, а не часть значения, как описано? например: мне нужно взять значение «ID документа» и получить его внутри атрибута targetID. <Target targetClass = "Document" targetID = "(Вставьте значение DocumentID)"/>?

Jesper Vernooij 15.05.2019 17:22

Вы всегда могли использовать шаблоны значений атрибутов, начиная с XSLT 1.0: targetID = "{$variable}". Меня всегда поражало, как некоторые люди тратят годы на написание XSLT, так и не открыв для себя эту функцию, которую, по моему мнению, вы преподаете в первый день любого курса.

Michael Kay 16.05.2019 08:30

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

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

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

Другие вопросы по теме