Adobe AEM Forms: вставка переменной XML в исходный шаблон XSLT

Я работаю с процессом, который использует одно действие XSLTService для преобразования XML. Он должен будет использовать как обычный источник XML, так и переменные процесса типа String и XML. Моя проблема в том, что я не могу понять, как вставлять переменные процесса типа XML в исходные шаблоны XSLT. У меня нет проблем со вставкой переменных типа String.

Это часть вставки моей таблицы стилей:

 <xsl:variable name="stringvariable" select="'{$/process_data/@stringVariable$}'"/>
 <xsl:variable name="externalNodes" select="'{$/process_data/inputNodeNames$}'"/>

Я попытался вставить данные между начальным и конечным тегами элемента переменной, но это не помогло. Строковая переменная вставляется и затем успешно распечатывается для проверки.

Я также создал локальную переменную (с тем же содержимым, что и внешняя) для справки:

 <xsl:variable name="internalNodes">
  <root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <block>$.Formularmetadata</block>
   <block>$.Sorteringsdata</block>
   <block>$.Metadata</block>
   <block>$.Verksamhetsdata</block>
  </root>
 </xsl:variable>

Затем я вызываю count(exsl:node-set()) для обеих XML-переменных в шаблоне, но только локальная переменная имеет значение выше 0.

Как я могу заставить это работать?

/BS

PS. Это полная таблица стилей XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="stringvariable" select="'{$/process_data/@stringVariable$}'"/>
 <xsl:variable name="externalNodes" select="'{$/process_data/inputNodeNames$}'"/>
 <xsl:variable name="internalNodes">
  <root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <block>$.Formularmetadata</block>
   <block>$.Sorteringsdata</block>
   <block>$.Metadata</block>
   <block>$.Verksamhetsdata</block>
  </root>
 </xsl:variable>

 <!-- Identity rule.-->
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <!-- Rewrite attribute ref to work with new XML.-->
 <xsl:template match="*[local-name()='bind']/@ref">
  <xsl:value-of select="$stringvariable "/>
  <xsl:value-of select="' Internal'"/><xsl:value-of select="count(exsl:node-set($internalNodes)/root/block)"/>
  <xsl:value-of select="' External'"/><xsl:value-of select="count(exsl:node-set($externalNodes)/root/block)"/>
 </xsl:template>
</xsl:stylesheet>

person Björn    schedule 18.05.2017    source источник


Ответы (1)


После еще нескольких экспериментов я обнаружил, что если я использую строковую переменную для передачи данных, она работает. Я вставляю его между начальным и конечным тегами, а затем использую после того, как встрою его в exsl:node-set(), чтобы он работал как XML.

Точка вставки:

<xsl:variable name="topNodes">'{$/process_data/@xmlTopNodes$}'</xsl:variable>

Использование в шаблоне:

<xsl:variable name="match" select="exsl:node-set($topNoder)/root/block[starts-with(current(), .)]"/>
person Björn    schedule 18.05.2017