Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
Bedrock Mission!

Learn more

View all

Sign in to view all badges

Adobe Summit 2023 [19th to 23rd March, Las Vegas and Virtual] | Complete AEM Session & Lab list
SOLVED

Problem inserting XML variable in XSLT Source template

Avatar

Level 3

I can't figure out how to inserting process variables of type XML into XSLT Source templates. I have no problem inserting variables of type String.


This is the insert part of my stylesheet:


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


The string variable is inserted and later printed for verification.


I have also created a local variable (with same contents as external) for reference:


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


I then invoke count(exsl:node-set()) on both variable in the template, but only the local have a value over 0.


How can I get this to work?


/BS


PS. This is the full XSL stylesheet:


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

1 Accepted Solution

Avatar

Correct answer by
Level 3

After som more experientation I found that if I use a string variable to transfer the data it seams to work. I insert it between a start- and end-tag and then use it after I have embedded it in exsl:node-set() to make it work as XML.

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

View solution in original post

1 Reply

Avatar

Correct answer by
Level 3

After som more experientation I found that if I use a string variable to transfer the data it seams to work. I insert it between a start- and end-tag and then use it after I have embedded it in exsl:node-set() to make it work as XML.

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