麻烦的xsl:for-每个使用XSL的选择:可变(trouble with xsl:for-each

2019-10-18 21:02发布

问题:

我有麻烦发生,其选择在通过位置的XML文档的一个不同的部分的节点的xpath表达式。 我使用XSL:变量,以创建表达,但是当我使用的xsl:for-每次用XSL的值变量作为我的SELECT语句中我得到一个错误。

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

导致错误:

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

当我打印出来的XSL的值变量我使用,我得到:

/example/inputs/dataset[1]/parameter

这是我想在换每次调用选择节点的有效和正确的XPath表达式。

是我的XSL的用法:变量的xsl:for-每个选择属性不正确的?

背景和充分的解释:

我使用XSLT来生成在以下XML结构的可用信息的RDF / XML表示。

在这种情况下,什么XML实际上是指一个过程进行两次; 第一次生成输出文件“a”和第二时间生成输出文件“B”。 参数“P1”和“P2”是该生成的文件“a”和参数“P3”是一个输入到该生成的文件“B”的执行的执行输入。

关于“处理”我生成一个单独的RDF并限定用于该过程的执行的输入和输出的每个输出。 基本上,我想定义从/示例/输入/数据集中的所有值[n]的/参数作为输入,其产生输出/示例/处理/输出/文件[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>

Answer 1:

“是我的XSL的用法:变量的xsl:对,每个选择属性不正确”

是。 在所选择的属性指定的值必须是一个的Valide节点集表达,即,它必须是一个XPath表达式,其值(可能为空)节点集。

你定义的变量是一个字符串类型。 字符串恰好是一个有效的XPath表达式,但它仍然是“只是”一个字符串。

我觉得你可以这样写它实现你想要的结果:

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


文章来源: trouble with xsl:for-each selection using xsl:variable
标签: xml xslt