2015-09-19 51 views
0

我有一個從TEI XML文檔生成的網站,其中的一個元素是從文件中存在的jpgs數量開始的頂部的一組縮略圖圖像。包含這些JPG格式的XML如下:通過XSLT瀏覽多個嵌套節點

<sourceDoc xml:id="TextContent"> 
    <surfaceGrp xml:id="wall" n="South Wall"> 
     <surface xml:id="p.1" n="panel"> 
      <label>Verse 27</label> 
      <graphic url="sw_test_1.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.30"> 
      <label>Verse 30</label> 
      <graphic url="sw_test_2.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.27"> 
      <label>Verse 27</label> 
      <graphic url="sw_test_3.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.56"> 
      <label>Verse 56</label> 
      <graphic url="sw_test_4.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.57"> 
      <label>Verse 57</label> 
      <graphic url="sw_test_5.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.58"> 
      <label>Verse 58</label> 
      <graphic url="sw_test_6.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.59"> 
      <label>Verse 59</label> 
      <graphic url="sw_test_7.jpg"/> 
     </surface> 
    </surfaceGrp> 
</sourceDoc> 

我申請到了以下相當混亂一片XSL,這因爲它上面存在,並利用地命名空間的代碼工作得很好:

<xsl:template name="menuWidth"> 
     <xsl:choose> 
      <xsl:when test="//tei:sourceDesc[1]/@xml:id='Clopton_Chantry_Chapel'"> 
       <xsl:attribute name="id">panel</xsl:attribute> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:attribute name="id">page</xsl:attribute> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

    <xsl:template name="menuHeader"> 
     <xsl:variable name="filename_length" select="string-length(tei:graphic/@url)"/> 
     <h1 class="menuHeader"> 
      <xsl:call-template name="menuWidth"/> 

      <div id="centerMenu"> 
       <xsl:apply-templates select=".././/tei:graphic" mode="list"/> 
      </div> 

      <xsl:variable name="last_block" as="xs:integer"> 
       <xsl:choose> 
        <xsl:when test="//tei:sourceDesc[1]/@xml:id='Clopton_Chantry_Chapel'"> 
         <xsl:value-of select="count(../preceding-sibling::tei:surfaceGrp)"/> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:value-of select="count(../../preceding-sibling::tei:surfaceGrp)"/> 
        </xsl:otherwise> 
       </xsl:choose>  
      </xsl:variable> 

     <xsl:variable name="next_block" as="xs:integer"> 
      <xsl:choose> 
       <xsl:when test="//tei:sourceDesc[1]/@xml:id='Clopton_Chantry_Chapel'"> 
        <xsl:value-of select="count(../following-sibling::tei:surfaceGrp)"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="count(../../following-sibling::tei:surfaceGrp)"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 

     <xsl:variable name="total_blocks"> 
      <xsl:value-of select="../last()"/> 
     </xsl:variable> 

     <xsl:variable name="group_position" as="xs:integer"> 
      <xsl:choose> 
       <xsl:when test="//tei:sourceDesc[1]/@xml:id='Clopton_Chantry_Chapel'"> 
        <xsl:value-of 
         select="../../count(tei:surfaceGrp) - count(../following-sibling::node()/position())" 
        /> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of 
         select="../../../count(tei:surfaceGrp) - count(../following-sibling::node()/position())" 
        /> 
       </xsl:otherwise> 
      </xsl:choose>  
     </xsl:variable> 

     <xsl:variable name="last_item_id"> 
      <xsl:choose> 
       <xsl:when test="//tei:sourceDesc[1]/@xml:id='Clopton_Chantry_Chapel'"> 
        <xsl:value-of 
         select="../../tei:surfaceGrp[last()]/tei:surface[last()]/@xml:id"/> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of 
         select="../../../tei:surfaceGrp[last()]/tei:surfaceGrp[last()]/tei:surface[last()]/@xml:id" 
        /> 
       </xsl:otherwise> 
      </xsl:choose>    
     </xsl:variable> 

     <div id="rightMenu"> 
      <xsl:choose> 
       <xsl:when test="count(preceding-sibling::tei:surface)+1 &gt; 1"> 
        <span class="menuitem" id="previousItem"> 
         <a class="nav_link"> 
          <xsl:attribute name="href"> 
           <xsl:value-of 
            select="concat(substring(preceding-sibling::*[1]/tei:graphic/@url,1,($filename_length - 4)),'.html')"/> 
           <!--<xsl:value-of select="concat(preceding-sibling::*[1]/@xml:id,'.html')"/></xsl:attribute>--> 
          </xsl:attribute> Previous</a> 
        </span> 
       </xsl:when> 
       <xsl:when test="count(../preceding-sibling::tei:surfaceGrp)+1 &gt; 1"> 
        <span class="menuitem" id="previousItem"> 
         <a class="nav_link"><xsl:attribute name="href"> 
          <xsl:value-of 
           select="concat(substring(../../tei:surfaceGrp[$last_block]/tei:surface[last()]/tei:graphic/@url,1,($filename_length - 4)),'.html')" 
          /> 
         </xsl:attribute>Previous</a> 
        </span> 
       </xsl:when> 
       <xsl:otherwise> 
        <span class="menuitem" id="previousItem"> 
         <a class="nav_link">Previous</a> 
        </span> 
       </xsl:otherwise> 
      </xsl:choose> 

      <xsl:choose> 
       <xsl:when test="$last_item_id = @xml:id"> 
        <span class="menuitem" id="nextItem"> 
         <a class="nav_link">Next</a> 
        </span> 
       </xsl:when> 
       <xsl:when test="position() = last()"> 
        <span class="menuitem" id="nextItem"> 
         <a class="nav_link"><xsl:attribute name="href"><xsl:value-of 
          select="concat(substring(../../tei:surfaceGrp[$group_position+1]/tei:surface[1]/tei:graphic/@url,1,($filename_length - 4)),'.html')" 
         /></xsl:attribute>Next</a> 
        </span> 
       </xsl:when> 
       <xsl:when test="not(position() = last())"> 
        <span class="menuitem" id="nextItem"> 
         <a class="nav_link"><xsl:attribute name="href"><xsl:value-of 
          select="concat(substring(following-sibling::*[1]/tei:graphic/@url,1,($filename_length - 4)),'.html')" 
         /></xsl:attribute>Next</a> 
        </span> 
       </xsl:when> 
       <xsl:otherwise/> 
      </xsl:choose> 
     </div> 
    </h1> 
</xsl:template> 

<xsl:template match="tei:graphic"/> 

<xsl:template match="tei:graphic" mode="list"> 
    <span class="menuitem" id="image_thumbnail"> 
     <a class="nav_link"> 
      <xsl:attribute name="href"> 
       <xsl:value-of select="concat(substring(@url,1,string-length(@url)-4),'.html')"/> 
      </xsl:attribute> 
      <img class="thumbnail"> 
       <xsl:attribute name="src"> 
        <xsl:value-of 
         select="concat('../../',$title_folder,'/',$witness,'/',$thumbnail_folder,'/',substring(@url,1,string-length(@url)-4),'-thumbnail.jpg')" 
        /> 
       </xsl:attribute> 
       <xsl:attribute name="alt"> 
        <xsl:value-of select="../tei:label"/> 
       </xsl:attribute> 
      </img> 
     </a> 
    </span> 
</xsl:template> 

此代碼的作品真的很好用單一surfaceGrp聲明,作爲第一個畫面顯示,但是當我必須包裝在另一surfaceGrp它只有最裏面的surfaceGrp工作的surfaceGrp。我的想法是,如果我通過group_position變量中的../上升了一個級別,它將顯示所有項目,但似乎不起作用,如第二張圖片所示。

First PictureSecond Picture

理想情況下,我想要的XSL生成看起來像HTML是這樣的,每個項目的縮略圖顯示:

<div id="centerMenu"> 
<span class="menuitem" id="image_thumbnail"> 
    <a class="nav_link" href="sw_test_1.jpg"> 
     <img class="thumbnail" src="../../Quis_Dabit/Clopton/Thumbnails/sw_test_1-thumbnail.jpg" alt="First Panel" /> 
    </a> 
</span> 
<span class="menuitem" id="image_thumbnail"> 
    <a class="nav_link" href="sw_test_2.html"> 
     <img class="thumbnail" src="../../Quis_Dabit/Clopton/Thumbnails/sw_test_2-thumbnail.jpg" alt="Second Panel" /> 
    </a> 
</span> 
<span class="menuitem" id="image_thumbnail"> 
    <a class="nav_link" href="sw_test_3.html"> 
     <img class="thumbnail" src="../../Quis_Dabit/Clopton/Thumbnails/sw_test_3-thumbnail.jpg" alt="Third Panel" /> 
    </a> 
</span> 
<span class="menuitem" id="image_thumbnail"> 
    <a class="nav_link" href="sw_test_4.html"> 
     <img class="thumbnail" src="../../Quis_Dabit/Clopton/Thumbnails/sw_test_4-thumbnail.jpg" alt="Fourth Panel" /> 
    </a> 
</span> 
<span class="menuitem" id="image_thumbnail"> 
    <a class="nav_link" href="sw_test_5.html"> 
     <img class="thumbnail" src="../../Quis_Dabit/Clopton/Thumbnails/sw_test_5-thumbnail.jpg" alt="Fifth Panel" /> 
    </a> 
</span> 
<span class="menuitem" id="image_thumbnail"> 
    <a class="nav_link" href="sw_test_6.html"> 
     <img class="thumbnail" src="../../Quis_Dabit/Clopton/Thumbnails/sw_test_6-thumbnail.jpg" alt="Sixth Panel" /> 
    </a> 
</span> 
</div> 
<div id="rightMenu"> 
    <span class="menuitem" id="previousItem"> 
     <a class="nav_link">Previous</a> 
    </span> 
    <span class="menuitem" id="nextItem"> 
     <a class="nav_link" href="sw_test_2.html">Next</a> 
    </span> 
</div> 

即使surfaceGrp包裹在發生列表中間:

<sourceDoc xml:id="TextContent"> 
    <surfaceGrp xml:id="wall" n="West Wall"> 
     <surface xml:id="EETS.T.60"> 
      <label>Verse 60</label> 
      <graphic url="ww_test_1.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.63"> 
      <label>Verse 63</label> 
      <graphic url="ww_test_2.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.65"> 
      <label>Verse 65</label> 
      <graphic url="ww_test_3.jpg"/> 
     </surface> 
    </surfaceGrp> 
    <surfaceGrp xml:id="wall" n="West Wall"> 
     <surface xml:id="EETS.T.66"> 
      <label>Verse 66</label> 
      <graphic url="ww_test_4.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.68"> 
      <label>Verse 68</label> 
      <graphic url="ww_test_5.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.69"> 
      <label>Verse 69</label> 
      <graphic url="ww_test_6.jpg"/> 
     </surface> 
    </surfaceGrp> 
</sourceDoc> 

修改我的代碼以達到此目的的最佳方法是什麼?

+1

我見過很多非常糟糕的問題,但是這個需要一等獎。您的示例輸入文檔與您提供的xslt樣式表完全沒有關係。給定的樣式表使用一個未定義的前綴('tei:'),它甚至在樣例輸入中都不存在。如果您將樣本輸入與預期輸出進行比較,則沒有任何讀者可以看到的鏈接。如果你想要一個解決方案,你必須提供一個或多個好的測試用例。測試用例是一個示例輸入,與該輸入的預期輸出配對,並清楚說明兩者如何相關。 –

+0

謝謝你的觀點。我編輯了這個問題,希望能提供一些額外的背景。如果事情還不清楚,請讓我知道。 – medievalmatt

+0

您不會「遍歷」XSLT中的節點。 XSLT引擎會爲您執行操作,在匹配項目上調用您的模板。不要使用'call-template'和'for-each'和'choose'命令編程XSLT。爲每個要匹配的模式編寫模板,並讓XSLT完成工作。扔掉你的程序,重新開始考慮這些原則。 –

回答

1

你的問題對我來說還很不清楚,所以這不會是你想要的,但它可能會指向你正確的方向。

這XSLT 2.0樣式表....

<xsl:transform 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

<xsl:output method="html" version="5" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*" /> 

<xsl:template match="/"> 
    <html> 
    <head> 
     <title>Source Doc</title> 
    </head> 
    <body> 
     <xsl:apply-templates select="sourceDoc" /> 
    </body> 
    </html> 
</xsl:template> 

<xsl:template match="sourceDoc"> 
    <div id="centerMenu"> 
    <xsl:apply-templates select="surfaceGrp/surface"/> 
    </div> 
</xsl:template> 

<xsl:template match="surface"> 
    <span class="menuitem" id="{@xml:id}"> 
    <a class="nav_link" href="{graphic/@url}"> 
     <img 
      class="thumbnail" 
      src="{graphic/@url}" 
      alt="First Panel" /> 
    </a> 
    </span> 
</xsl:template> 

</xsl:transform> 

...將改變這種輸入XML文檔...

<sourceDoc xml:id="TextContent"> 
    <surfaceGrp xml:id="wall" n="South Wall"> 
     <surface xml:id="p.1" n="panel"> 
      <label>Verse 27</label> 
      <graphic url="sw_test_1.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.30"> 
      <label>Verse 30</label> 
      <graphic url="sw_test_2.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.27"> 
      <label>Verse 27</label> 
      <graphic url="sw_test_3.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.56"> 
      <label>Verse 56</label> 
      <graphic url="sw_test_4.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.57"> 
      <label>Verse 57</label> 
      <graphic url="sw_test_5.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.58"> 
      <label>Verse 58</label> 
      <graphic url="sw_test_6.jpg"/> 
     </surface> 
     <surface xml:id="EETS.T.59"> 
      <label>Verse 59</label> 
      <graphic url="sw_test_7.jpg"/> 
     </surface> 
    </surfaceGrp> 
</sourceDoc> 

...這個HTML輸出文檔...

<!DOCTYPE HTML> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>Source Doc</title> 
    </head> 
    <body> 
     <div id="centerMenu"> 

     <span class="menuitem" id="p.1"> 
      <a class="nav_link" href="sw_test_1.jpg"> 
      <img class="thumbnail" src="sw_test_1.jpg" alt="First Panel"> 
      </a> 
     </span> 

     <span class="menuitem" id="EETS.T.30"> 
      <a class="nav_link" href="sw_test_2.jpg"> 
      <img class="thumbnail" src="sw_test_2.jpg" alt="First Panel"> 
      </a> 
     </span> 

     <span class="menuitem" id="EETS.T.27"> 
      <a class="nav_link" href="sw_test_3.jpg"> 
      <img class="thumbnail" src="sw_test_3.jpg" alt="First Panel"> 
      </a> 
     </span> 

     <span class="menuitem" id="EETS.T.56"> 
      <a class="nav_link" href="sw_test_4.jpg"> 
      <img class="thumbnail" src="sw_test_4.jpg" alt="First Panel"> 
      </a> 
     </span> 

     <span class="menuitem" id="EETS.T.57"> 
      <a class="nav_link" href="sw_test_5.jpg"> 
      <img class="thumbnail" src="sw_test_5.jpg" alt="First Panel"> 
      </a> 
     </span> 

     <span class="menuitem" id="EETS.T.58"> 
      <a class="nav_link" href="sw_test_6.jpg"> 
      <img class="thumbnail" src="sw_test_6.jpg" alt="First Panel"> 
      </a> 
     </span> 

     <span class="menuitem" id="EETS.T.59"> 
      <a class="nav_link" href="sw_test_7.jpg"> 
      <img class="thumbnail" src="sw_test_7.jpg" alt="First Panel"> 
      </a> 
     </span> 

     </div> 
    </body> 
</html> 
+0

感謝您再次看看它。這樣做可以滿足我需要的大部分功能,但是我想我可能需要退後一步,更抽象地提出問題,而不是試圖保存我已經以某種形式編寫的代碼。 – medievalmatt