我有困難寫生成麪包屑試製出的節點結構的模板。它不能正常工作到現在爲止,沒有在我的思想應該怎麼走項目路徑的一些缺陷。生成與XSL一個麪包屑從節點結構
考慮下面的頁面結構:
<!-- ===== SITE PAGE STRUCTURE ===================================== -->
<index>
<item section="home" id="index"></item>
<item section="service" id="index">
<item id="content-management-systems">
<item id="p1-1"/>
<item id="p1-2"/>
<item id="p1-3"/>
</item>
<item id="online-stores"></item>
<item id="search-engines-and-ir"></item>
<item id="web-applications"></item>
</item>
<item section="solutions" id="index">
<item id="document-clustering"></item>
</item>
<item section="company" id="index">
<item section="company" id="about"></item>
<item section="company" id="philosophy" ></item>
...
</item>
...
</item>
本網站指數代表了其層次結構的XML內容頁(認爲它是一個菜單)網站結構。它包含部分,代表的網站部分就像家庭,公司,服務,解決方案等。這些部分可以包含分部分與頁面,或只是普通的內容頁面。內容頁面(其標題,文本內容等xml內容)由項目樹中的@id屬性標識。 @id屬性主要用於獲取將呈現爲html的整個頁面的內容。 痕跡導航模板使用項目節點@Id屬性讓頁面(這將在導航條來顯示)的稱號。
我嘗試實現以下模板,步行通過檢查樹中的目標部分屬性@section和目標頁面屬性@id。我希望它走線,直到目標item_target通過比較祖先@section屬性,並與該軸的每個節點的item_target $的@id找到。
例如:屬性* $ item_section =服務*和頁面ID *目標,item_target = P1-1 *現在應該遞歸 「走」 到部分分支 「服務」(深度爲1),檢查是否目標頁面@id在此級別上找到。在這種情況下,它沒有找到,所以它使下一recurive調用(通過應用模板)到下一個項目節點級(在這種情況下,這將是內容管理系統,有目標項目頁面P1 -1被發現,所以跟蹤過程完成:
結果應該是這樣的:
首頁>>服務>>內容管理系統>> P1-1
但不幸的是它是沒有正確的工作,至少不是在所有情況下,也可能更容易解決把它作爲一個遞歸模板,從頂層(0級)到目標頁面(項目節點)作爲一個葉子。
<!-- walk item path to generate a breadcrumb trail -->
<xsl:template name="breadcrumb">
<a>
<xsl:attribute name="href">
<xsl:text>/</xsl:text>
<xsl:value-of select="$req-lg"/>
<xsl:text>/home/index</xsl:text>
</xsl:attribute>
<xsl:value-of select="'Home'"/>
</a>
<xsl:apply-templates select="$content/site/index" mode="Item-Path">
<xsl:with-param name="item_section" select="'service'"/>
<xsl:with-param name="item_target" select="'search-engines-and-ir'"/>
<xsl:with-param name="depth" select="0"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="item" mode="Item-Path">
<xsl:param name="item_section" />
<xsl:param name="item_target" />
<xsl:param name="depth" />
<!--
depth=<xsl:value-of select="$depth"/>
count=<xsl:value-of select="count(./node())"/><br/>
-->
<xsl:variable name="cur-id" select="@id"/>
<xsl:variable name="cur-section" select="@section"/>
<xsl:choose>
<xsl:when test="@id=$item_target">
>>
<a>
<xsl:attribute name="href">
<xsl:text>/</xsl:text>
<!-- req-lg: global langauge variable -->
<xsl:value-of select="$req-lg"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="$item_section"/>
<xsl:text>/</xsl:text>
<xsl:if test="$depth = 2">
<xsl:value-of select="../@id"/>
<xsl:text>/</xsl:text>
</xsl:if>
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:value-of
select="$content/page[@id=$cur-id]/title"/>
</a>
</xsl:when>
<xsl:otherwise>
<xsl:if test="ancestor-or-self::item/@section = $item_section and count(./node()) > 0">
>>:
<a>
<xsl:attribute name="href">
<xsl:text>/</xsl:text>
<!-- req-lg: global langauge variable -->
<xsl:value-of select="$req-lg"/>
<xsl:text>/</xsl:text>
<xsl:value-of select="$item_section"/>
<xsl:text>/</xsl:text>
<xsl:if test="$depth = 2">
<xsl:value-of select="../@id"/>
<xsl:text>/</xsl:text>
</xsl:if>
<xsl:value-of select="@id"/>
</xsl:attribute>
<xsl:value-of
select="$content/page[@id=$cur-id and @section=$item_section]/title"/>
</a>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
<xsl:apply-templates select="item" mode="Item-Path">
<xsl:with-param name="item_section" select="$item_section"/>
<xsl:with-param name="item_target" select="$item_target"/>
<xsl:with-param name="depth" select="$depth + 1"/>
</xsl:apply-templates>
</xsl:template>
,以便在模板中的硬編碼參數麪包屑,目標節=「服務」和目標網頁=「搜索引擎和-IR」,我希望像
回家輸出>>服務>>搜索引擎和紅外
但輸出
首頁>>服務>>內容管理系統>> S目錄操作搜索,引擎和紅外
這顯然是不正確的。
任何人都可以給我一個提示如何解決這個問題?避免深度檢查會更加優雅,但到現在爲止,我無法想到其他方式,我確信有更優雅的解決方案。
我使用XSLT 1.0(通過PHP5的libxml)。
希望我的問題很清楚,如果不是,請提問:-)感謝您的幫助!
的問題是不明確的。請編輯並解釋在源XML文檔中如何表示父子關係。另外,請解釋給出了什麼以及必須在樹*的條款中產生什麼。 –
@ Dimitre Novatchev:對不起,如果我的問題不清楚。我編輯了我的問題,並試圖更準確地看到xml樹和xsl模板代碼之間的文本。希望它更清楚我試圖實現的目標...... –
在您的輸入文檔中,服務不是家中的孩子。你的預期產出不應該簡單地......服務>>搜索引擎和搜索引擎? –