Я использую 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>
Заранее благодарю за помощь, обращайтесь за разъяснениями!
Ваше здоровье,
Джеспер
В 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)"/>?
Вы всегда могли использовать шаблоны значений атрибутов, начиная с XSLT 1.0: targetID = "{$variable}"
. Меня всегда поражало, как некоторые люди тратят годы на написание XSLT, так и не открыв для себя эту функцию, которую, по моему мнению, вы преподаете в первый день любого курса.
В итоге я исправил это немного иначе, чем ответ Майкла Кея, и я хочу включить его для завершения:
<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>
Я надеюсь, что это поможет кому-то! :)
См.
xsl:value-of
инструкция