开发者

trouble with xsl:for-each selection using xsl:variable

Problem:

I am having trouble generating an xpath expression that selects a node in a different section of the XML document by position. I am using xsl:variable to create the expression, but when I use a xsl:for-each with the value of the xsl:variable as my select statement I get an error.

<xsl:variable name="input_params_query">
  <xsl:text disable-output-escaping="yes">/example/inputs/dataset[</xsl:text>
  <xsl:number value="position()" format="1" />
  <xsl:text disable-output-escaping="yes">]/parameter</xsl:text>
</xsl:variable>

<xsl:for-each select="$input_params_query">
  <input rdf:resource="#{@name}"/>
</xsl:for-each>

Results in the error:

The 'select' expression does not evaluate to a node set.

When I print out the value of the xsl:variable I am using I get:

/example/inputs/dataset[1]/parameter

which is a valid and correct Xpath expression for the nodes I am trying to select in the for-each call.

Is my usage of the xsl:variable as xsl:for-each select attribute incorrect?

Background and Full Explanation:

I am using XSLT to generate a RDF/XML representation of information available in the following XML structure.

In this case what the XML really means is that a process was run twice; the first time generating output file "a" and the second time generation output file "b". The parameters "p1" and "p2" were inputs for the executi开发者_StackOverflowon that generated file "a" and the parameter "p3" was an input to the execution that generated file "b".

For each output of 'process' I am generating a RDF individual and defining the inputs and outputs for that process execution. Basically, I want to define all values from /example/inputs/dataset[n]/parameters as inputs to the process which generates the output /example/process/outputs/file[n].

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 version="1.0">
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <xsl:template match="//process">
  <xsl:for-each select="outputs/*">

  <!-- declare rdf resource of type Process, define Process outputs -->
  <!-- ... this I already have working so I have withheld for brevity -->

  <!-- define input parameters -->

   <xsl:variable name="input_params_query">
    <xsl:text disable-output-escaping="yes">/example/inputs/dataset[</xsl:text>
    <xsl:number value="position()" format="1" />
    <xsl:text disable-output-escaping="yes">]/parameter</xsl:text>
   </xsl:variable>

   <xsl:for-each select="$input_params_query">
    <input rdf:resource="#{@name}"/>
   </xsl:for-each>

  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>


"Is my usage of the xsl:variable as xsl:for-each select attribute incorrect?"

yes. the value specified in select attributes must be a valide node-set expression, that is, it must be an Xpath expression that evaluates to a (possibly empty) node set.

The variable you defined is of a string type. the string happens to be a valid Xpath expression, but it is still 'just' a string.

I think you can achieve your intended result by writing it like this:

<xsl:template match="//process">
  <xsl:for-each select="outputs/*">
    <!-- declare rdf resource of type Process, define Process outputs -->
    <!-- ... this I already have working so I have withheld for brevity -->

    <!-- define input parameters -->
    <xsl:variable name="position" select="position()"/>

    <xsl:for-each select="/example/inputs/dataset[$position]">
      <input rdf:resource="#{@name}"/>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜