SSS
SSS

Reputation: 3

XPTY0004: An empty sequence is not allowed as the value of variable while loading xslt using saxon templatefactory

I updated the provided xslt to accept a param "multiplexpaths" from my source and assignin enter code here`g this to nodes variable in xslt to below:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">
    
    <xsl:param name="multiplexpaths" as="xs:string" static="yes" />
  <!--  xsl:param name="copy" as="xs:string" static="yes" select="'//other[. = 1345], //more[. = 2]'"/-->

  <xsl:variable name="nodes" _select="{$multiplexpaths}"/>
  <xsl:variable name="ancestors" select="$nodes/ancestor::*"/>
  
  <xsl:mode on-no-match="shallow-skip"/>
  
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="$nodes">
    <xsl:sequence select="."/>
  </xsl:template>
  
  <xsl:template match="$ancestors">
      <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
      </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

Upvotes: 0

Views: 2278

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167716

For the xsl:evaluate example, you would need to use Saxon 10 HE, 9.9 HE doesn't support xsl:evaluate.

As for setting a static parameter with Saxon 9.9 and s9api, a simple example is

    String paths = "catalog/cd1,catalog/Test/value/a1";
    
    Processor processor = new Processor(true);
    
    XsltCompiler xsltCompiler = processor.newXsltCompiler();
    
    xsltCompiler.setParameter(new QName("copy"), new XdmAtomicValue(paths));
    
    XsltExecutable xsltExecutable = xsltCompiler.compile(new StreamSource("static-param-example2.xsl"));
    
    Xslt30Transformer xslt30Transformer = xsltExecutable.load30();
    
    xslt30Transformer.transform(new StreamSource("input-sample1.xml"), xslt30Transformer.newSerializer(System.out));

with the input-sample1.xml being

<catalog>
    <cd1>
        <name>abc</name>
        <Stext>1234</Stext>
        <Tag>uuuu</Tag>
    </cd1>
    <cd2>
        <name>abc</name>
        <Stext>1234</Stext>
        <Tag>uuuu</Tag>
    </cd2>
    <Test>
        <value>
            <a1>123</a1>
            <b1>77474</b1>
        </value>
    </Test>
</catalog>

and the XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:param name="copy" as="xs:string" static="yes" select="'()'"/>

  <xsl:variable name="nodes" _select="{$copy}"/>
  <xsl:variable name="ancestors" select="$nodes/ancestor::*"/>
  
  <xsl:mode on-no-match="shallow-skip"/>
  
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="$nodes">
    <xsl:sequence select="."/>
  </xsl:template>
  
  <xsl:template match="$ancestors">
      <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
      </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

this outputs

<catalog>
   <cd1>
      <name>abc</name>
      <Stext>1234</Stext>
      <Tag>uuuu</Tag>
   </cd1>
   <Test>
      <value>
         <a1>123</a1>
      </value>
   </Test>
</catalog>

So the main point is to set the parameter on the XsltCompiler and not after compilation on the transformer.

Upvotes: 0

Related Questions