我有一個從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 > 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 > 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
變量中的../
上升了一個級別,它將顯示所有項目,但似乎不起作用,如第二張圖片所示。
理想情況下,我想要的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>
修改我的代碼以達到此目的的最佳方法是什麼?
我見過很多非常糟糕的問題,但是這個需要一等獎。您的示例輸入文檔與您提供的xslt樣式表完全沒有關係。給定的樣式表使用一個未定義的前綴('tei:'),它甚至在樣例輸入中都不存在。如果您將樣本輸入與預期輸出進行比較,則沒有任何讀者可以看到的鏈接。如果你想要一個解決方案,你必須提供一個或多個好的測試用例。測試用例是一個示例輸入,與該輸入的預期輸出配對,並清楚說明兩者如何相關。 –
謝謝你的觀點。我編輯了這個問題,希望能提供一些額外的背景。如果事情還不清楚,請讓我知道。 – medievalmatt
您不會「遍歷」XSLT中的節點。 XSLT引擎會爲您執行操作,在匹配項目上調用您的模板。不要使用'call-template'和'for-each'和'choose'命令編程XSLT。爲每個要匹配的模式編寫模板,並讓XSLT完成工作。扔掉你的程序,重新開始考慮這些原則。 –