xsl:variable在xsl:for-each中不起作用

时间:2014-01-21 15:23:08

标签: xslt apache-fop

我有以下XSL:

<xsl:key name="Hosts" match="Report/Host" use="ID"/>
...
<xsl:for-each select="Report/Host[count(. | key('Hosts', ID)[1]) = 1 and Factor = 8]">
 <xsl:variable name="ThisID" select="ID" />
 <xsl:for-each select="/Report/Host[count(. | key('Hosts', Name)[1]) = 1]">
  <xsl:for-each select="key('Hosts', Name)[ID = $ThisID]">
   <xsl:value-of select="Name"/>
  </xsl:for-each>
 </xsl:for-each>
</xsl:for-each>

当我通过FOP 1.1运行时(不确定fop是否应该责备),我收到此错误:

SEVERE: org.xml.sax.SAXParseException; systemId: file:/C:/temp/fop/fop-1.1/pdf-report.xml; lineNumber: 243; columnNumber: 180; java.lang.RuntimeException: Variable not resolvable: ThisID
...
; SystemID: file:/C:/temp/fop/fop-1.1/pdf-report.xml; Line#: 243; Column#: 180
javax.xml.transform.TransformerException: java.lang.RuntimeException: Variable not resolvable: ThisID

第243行,就是这一行:

<xsl:for-each select="Report/Host[count(. | key('Hosts', ID)[1]) = 1 and Factor = 8]">

我不明白为什么这不起作用

1 个答案:

答案 0 :(得分:1)

我终于找到了错误,不是因为这个元素,Xalan只是不善于告诉你这个问题。

我之前有一个错误,它没有导致渲染“停止”,但确实导致任何额外的xsl:变量未经处理,反过来,不允许任何引用它们。

调试是这样的:

  1. 我制作了一个我的数据模型,我可以使用最小的数据集
  2. 我把上面的代码搞得一团糟地运行
  3. 提交确认
  4. 我知道XSL很好,但还有其他东西阻止它工作
  5. 我开始评论XML(原始版)直到它工作
  6. 我取消注释所有内容,直到它停止工作
  7. 我把这个归结为
  8. XSL声明:

    <xsl:variable name="HostURIRequestSuffix">
     <xsl:if test="/Report/Scan/ScanDetails/SelectedHostReport = 'true'">
      <xsl:call-template name="GetHostsURL"/>
     </xsl:if>
    </xsl:variable>
    

    这个错误:

    file:/C:/temp/fop/fop-0.95/pdf-report.xml; Line #20; Column #48; org.xml.sax.SAXException: ElemTemplateElement error: GetHostsURL
    javax.xml.transform.TransformerException: ElemTemplateElement error: GetHostsURL
    

    出于某种原因,这导致任何额外的xsl:变量被忽略,而其余的渲染工作完美,一旦我修复了这一切,一切正常,感谢大家的帮助