2011-06-09 48 views
0

我工作的一個小項目學習XSL值從一個節點選擇的數據,我經歷了一個問題,運行...XSL:基於可變

我有一個DocBook與文件按部門分類的人員名單系列。然而,有時候,我會有一個人在自己的小團體中工作。爲了避免重複數據,我指定了一個人節點要麼在其節點中包含數據,要麼包含一個鏈接到其主節點的外部參照節點。當我遍歷組中的所有人時,我需要檢查節點是鏈接節點還是數據節點,並相應地調整我的變量。

這裏的選擇代碼

<xsl:choose> 
    <xsl:when test="xref"> 
     <xsl:variable name="TAG_ID" select="xref/@linkend" /> 
     <xsl:variable name="NAME" select="//*[@id='$TAG_ID']/para[@id='who']" /> 
     <xsl:variable name="EMAIL" select="//*[@id='$TAG_ID']/para[@id='who']/ulink/@url" /> 
     <xsl:variable name="IMAGE" select="//*[@id='$TAG_ID']/para[@id='image']" /> 
     <xsl:variable name="MEET" select="//*[@id='$TAG_ID']/para[@id='meet']" /> 
     <xsl:call-template name="output_person" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:variable name="NAME" select="para[@id ='who']" /> 
     <xsl:variable name="EMAIL" select="para[@id='who']/ulink/@url" /> 
     <xsl:variable name="IMAGE" select="para [@id='image']" /> 
     <xsl:variable name="MEET" select="para [@id='meet']" /> 
     <xsl:call-template name="output_person" /> 
    </xsl:otherwise> 
</xsl:choose> 

然而,當我嘗試運行此我得到以下錯誤...

runtime error: file team.xsl line 92 element img 
Variable 'IMAGE' has not been declared. 
xmlXPathCompiledEval: evaluation failed 

經過一番尋找在互聯網上,我同時看到代碼完成了這一點,人們說這是不可能的。

所以我的問題是雙重的...

我可以選擇基於一個變量的特定節點?

如果不是,甚至可以這樣做嗎?

+0

哪條線是線92? – 2011-06-09 16:42:02

+0

第92行包含在「output_person」模板中。我的主要問題是錯誤xmlXPathCompiledEval:評估失敗。 – 2011-06-09 16:48:35

+0

錯誤似乎提到一個未聲明的已使用變量('$ IMAGE')。但是,您所展示的代碼中沒有「$ IMAGE」變量。也許你的_choose code_是錯誤的選擇:)給我們正確的上下文。更多的,這看起來不像是聲明變量的正確方法。 – 2011-06-09 16:56:24

回答

1

您聲明的變量將不在您的output_person模板的範圍內。爲了達到此目的,您需要讓output_person模板接受參數,然後將這些參數作爲call-template的一部分傳遞。

另請注意,對變量的引用不應包含在引號中。

例如:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<!-- other templates --> 
<xsl:template match="your-element"> 
    <xsl:choose> 
     <xsl:when test="xref"> 
      <xsl:variable name="TAG_ID" select="xref/@linkend" /> 
      <xsl:variable name="NAME" select="//*[@id=$TAG_ID]/para[@id='who']" /> 
      <xsl:variable name="EMAIL" select="//*[@id=$TAG_ID]/para[@id='who']/ulink/@url" /> 
      <xsl:variable name="IMAGE" select="//*[@id=$TAG_ID]/para[@id='image']" /> 
      <xsl:variable name="MEET" select="//*[@id=$TAG_ID]/para[@id='meet']" /> 
      <xsl:call-template name="output_person"> 
       <xsl:with-param name="NAME" select="$NAME"/> 
       <xsl:with-param name="EMAIL" select="$EMAIL"/> 
       <xsl:with-param name="IMAGE" select="$IMAGE"/> 
       <xsl:with-param name="MEET" select="$MEET"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:variable name="NAME" select="para[@id ='who']" /> 
      <xsl:variable name="EMAIL" select="para[@id='who']/ulink/@url" /> 
      <xsl:variable name="IMAGE" select="para [@id='image']" /> 
      <xsl:variable name="MEET" select="para [@id='meet']" /> 
      <xsl:call-template name="output_person"> 
       <xsl:with-param name="NAME" select="$NAME"/> 
       <xsl:with-param name="EMAIL" select="$EMAIL"/> 
       <xsl:with-param name="IMAGE" select="$IMAGE"/> 
       <xsl:with-param name="MEET" select="$MEET"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
<xsl:template name="output_person"> 
    <xsl:param name="NAME"/> 
    <xsl:param name="EMAIL"/> 
    <xsl:param name="IMAGE"/> 
    <xsl:param name="MEET"/> 
    <!-- your logic here --> 
</xsl:template> 

+0

這是不正確的。你不能兩次聲明同一個變量。這條規則適用於任何編程語言,但適用於無類型變量的編程語言。 – 2011-06-09 17:29:02

+0

我認爲這是正確的:http://www.w3.org/TR/xslt#local-variables這裏是spec ref:「除了​​被允許在頂層,xsl:variable和xsl:param都是也可以在模板中使用xsl:變量允許模板中的任何位置允許指令,在這種情況下,綁定對所有後續兄弟和它們的後代都是可見的。 – massfords 2011-06-09 17:49:03

+0

我指的是'xsl:choose'。然而,它看起來沒問題,你是對的。我錯了。 – 2011-06-09 17:54:33