我有以下Html文檔。如何根據其他元素的文本節點內的值更改HTML文檔的元素序列
<html>
<head><title>...</title></head>
<body>
<div class="figure-wrapper" id="figure1">...</div>
<p class="para">Lorem Ipsum (see Fig. 1). Lorem Ipsum (see Fig. 2).</p>
<div class="figure-wrapper" id="figure3">...</div>
<p class="para">Lorem Ipsum (see Fig. 3). Lorem Ipsum (see Fig. 1).</p>
<div class="figure-wrapper" id="figure2">...</div>
</body>
</html>
什麼我想實現
- 將每一個數字元素(由
<div class="figure-wrapper">
元素包裹的)具有第一參考它的一個段落之後。 - 如果第一段之後的元素本身就是一個數字元素,那麼應該把這個數字元素放在它後面。
實施例和理想輸出
的<div class="figure-wrapper" id="figure1>
元件應放置僅因爲它是引用該圖中的所有段落中的第一個的第一段之後。
<html>
<head><title>...</title></head>
<body>
<p class="para">Lorem Ipsum (see Fig. 1). Lorem Ipsum (see Fig. 2).</p>
<div class="figure-wrapper" id="figure1">...</div>
<div class="figure-wrapper" id="figure2">...</div>
<p class="para">Lorem Ipsum (see Fig. 3). Lorem Ipsum (see Fig. 1).</p>
<div class="figure-wrapper" id="figure3">...</div>
</body>
</html>
限制
沒有明確提及(在HTML元素計)與圖中的元素在輸入文檔中存在。因此,我必須分析段落內容(例如,出現某些值,如圖x等),以推斷段落內是否已經對圖形進行了引用。
我到目前爲止製作的是以下解決方案。
我嘗試了一個奇怪的混合使用身份轉換模式,密鑰和多通道方法,但是,我想不通。
<xsl:stylesheet
xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"
xmlns:xd ="http://www.oxygenxml.com/ns/doc/xsl"
xmlns:fn ="http://www.w3.org/2005/xpath-functions"
xmlns:functx="http://www.functx.com"
exclude-result-prefixes="xd"
version="2.0">
<!-- maximum number of figure references within one paragraph -->
<xsl:variable name="figThreshold" select="100" />
<!-- index of all figure elements -->
<xsl:key name="figure-index" match="node()[@class='figure-wrapper']" use="@id" />
<!-- transformation init -->
<xsl:template match="/">
<xsl:variable name="pass1">
<xsl:apply-templates mode="pass1" />
</xsl:variable>
<xsl:variable name="pass2">
<xsl:for-each select="$pass1">
<xsl:apply-templates mode="pass2" />
</xsl:for-each>
</xsl:variable>
<xsl:copy-of select="$pass2" />
</xsl:template>
<!-- pass 1 start -->
<xsl:template match="node() | @*" mode="pass1">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="pass1" />
</xsl:copy>
</xsl:template>
<xsl:template match="node()[name()='p']" mode="pass1" priority="1">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="pass1" />
</xsl:copy>
<xsl:call-template name="locate-and-move-figures" />
</xsl:template>
<!-- iterates x times (see value of figThreshold) over paragraph text and increment each time the figure number reference to look for -->
<xsl:template name="locate-and-move-figures">
<xsl:param name="figCount" select="1" />
<xsl:variable name="figureId" select="concat('figure',$figCount)" />
<xsl:variable name="searchStringText" select="concat('Fig. ',$figCount)) />
<!-- if figure reference is found within paragraph insert the appropriate after it -->
<xsl:if test="$searchStringText">
<xsl:copy-of select="key('figure-index',$figureId)" />
</xsl:if>
<!-- recursive call of template unless threshold value is reached -->
<xsl:if test="$figCount < $figThreshold">
<xsl:call-template name="locate-and-move-figures">
<xsl:with-param name="figCount" select="$figCount + 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="node()[@class='figure-wrapper']" mode="pass1" />
<!-- pass 1 end -->
<!-- pass 2 start - eliminations of all duplicates -->
<xsl:template match="node() | @*" mode="pass2">
<xsl:copy>
<xsl:apply-templates select="node() | @*" mode="pass2" />
</xsl:copy>
</xsl:template>
<!-- pass 2 end -->
</xsl:stylesheet>
輸出我得到的是這樣的:
<html>
<head><title>...</title></head>
<body>
<p class="para">Lorem Ipsum (see Fig. 1). Lorem Ipsum (see Fig. 2).</p>
<div class="figure-wrapper" id="figure1">...</div>
<div class="figure-wrapper" id="figure2">...</div>
<p class="para">Lorem Ipsum (see Fig. 3). Lorem Ipsum (see Fig. 1).</p>
<div class="figure-wrapper" id="figure1">...</div>
<div class="figure-wrapper" id="figure3">...</div>
</body>
</html>
的問題
- 重複的
<div class="figure-wrapper">
元素。我試圖在第二回閤中擺脫他們,但我無法將重複刪除與身份轉換模式結合在一起。 - 對於每個段落在圖形參考中獲得x次遞增搜索(在本例中爲100次)的事實,我並不感到滿意。我可以選擇一個較低的閾值(例如20次),但是恐怕我可能會錯過一些參考文獻,因爲一個段落內的參考文獻的自然最大值不存在。
任何與這些問題的幫助是高度讚賞。