Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT应用模板递归性的厄运!_Xslt_Xpath_Apply Templates - Fatal编程技术网

XSLT应用模板递归性的厄运!

XSLT应用模板递归性的厄运!,xslt,xpath,apply-templates,Xslt,Xpath,Apply Templates,我必须遵循以下XML文档结构: <option_set id="1"> <option>Yes</option> <option>No</option> <option>Maybe</option> </option_set> <question option_set="1"> <text>Do you like cake?</text> <

我必须遵循以下XML文档结构:

<option_set id="1">
  <option>Yes</option>
  <option>No</option>
  <option>Maybe</option>
</option_set>

<question option_set="1">
  <text>Do you like cake?</text>
</question>
<question option_set="1">
  <text>Is the cake a lie?</text>
</question>

对
不
大概
你喜欢蛋糕吗?
蛋糕是谎言吗?
为了使事情保持干涸,我们的想法是提出一些不同的问题,这些问题有着共同的选项集。然后可以使用XSLT构建这些文件。我的模板如下:

<xsl:template match="question[@option_set and not(option)]">
  <!-- Build a whole question with its options
       (copy the options across and then apply-templates?) -->
</xsl:template>

<xsl:template match="question[option]">
  <!-- Match a whole question, with options, for making pretty HTML out of -->
</xsl:template>

这个想法是,一旦顶级模板匹配了我的问题,我将得到如下内容:

<question>
  <text>Do you like cake?</text>
  <option>Yes</option>
  <option>No</option>
  <option>Maybe</option>
</question>

你喜欢蛋糕吗?
对
不
大概
。。。然后,它可以被底部的模板匹配并放入我的HTML文档中。我的问题是如何创建实际执行该操作的(顶部)模板。我很接近,但这仍然不起作用:

<xsl:template match="question[@option_set and not(option)]">
  <xsl:variable name="optset" select="@option_set"/>

  <xsl:copy>
    <xsl:copy-of select="text"/>
    <xsl:copy-of select="//option_set[@id=$optset]/option"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

转换后的问题块及其选项将被复制到文档中,而不是由顶部模板拾取并生成漂亮的HTML

如果我试图
那么我就会陷入无限循环。


<xsl:key name="kOptionSet" match="option_set" use="@id" />

<xsl:template match="question">
  <xsl:copy>
    <xsl:copy-of select="text" />
    <xsl:copy-of select="key('kOptionSet', @option_set)/option" />
    <xsl:apply-templates />
  </xsl:copy>
</xsl:template>

应该做你想做的事。我不知道你为什么首先要递归。

不知道你最终要做什么,但这可能会对你有所帮助

<xsl:template match="question">
  <xsl:value-of select="text"/>: 
  <select>
     <xsl:variable name="option_set_id" select="@option_set"/>
     <xsl:apply-templates select="option | //option_set[@id=$option_set_id]/option"/>
  </select>
</xsl:template>

<xsl:template match="option">
   <option>
      <xsl:value-of select="."/>
   </option>
</xsl:template>

: 

有一些调整,如添加上面的键,检查未使用的选项集等。但这将让您开始。

在您的示例中没有包含
选项的
问题,那么你的
的目的是什么呢?问题的目的似乎是让
生成一个与
格式相同的
节点,这样模板就可以生成一些其他格式的最终输出。@Justin…这是不可能的,因为模板生成的是RTF,而不是其他格式的节点可以进一步匹配。是的,正如Justin W所说,第一个模板的目的是将选项复制到问题上,然后由
匹配。请解释这些RTF是什么?我想这也许可以解释我遇到的问题:)@davertfs是结果树片段。顺便问一下,您使用的XSLT版本是什么?谢谢,但不幸的是,我认为这无助于解决我最初的问题。目标是从
(无选项)到
(有选项)到
,再到(一堆HTML),我还更新了带有自己选项的问题的函数答案。现在,在输出之前不需要“递归”步骤。@Justin,好的,等等,编辑看起来很有趣。我想我可以用这个。。。让我试试。是的,这就是诀窍<代码>使用问题上的选项或属于相关
的选项应用模板。谢谢好的,只有在贾斯汀的编辑之后,我才真正了解你的情况。很高兴你找到了有用的东西。