2012-12-11 79 views
0

我有一個XML看起來像:如何通過XSL迭代兄弟節點?

<?xml version="1.0" encoding="utf-8"?> 
<siteMap> 
    <siteMapNode> 
     <siteMapNode url="/personal/" > 
      <siteMapNode url="/personal/abc/" title="abc" > 
       <siteMapNode url="/personal/abc/xyz" title="abc" /> 
       <siteMapNode url="/personal/abc/pqr" title="pqr" /> 
      </siteMapNode> 
      <siteMapNode url="/personal/opq/" title="abc" > 
       <siteMapNode url="/personal/opq/xyz" title="abc" /> 
       <siteMapNode url="/personal/opq/pqr" title="pqr" /> 
      </siteMapNode> 
     </siteMapNode> 
     <siteMapNode url="/reasonal/" > 
      <siteMapNode url="/reasonal/abc/" title="abc" > 
       <siteMapNode url="/reasonal/abc/xyz" title="abc" /> 
       <siteMapNode url="/reasonal/abc/pqr" title="pqr" /> 
      </siteMapNode> 
      <siteMapNode url="/reasonal/opq/" title="abc" > 
       <siteMapNode url="/reasonal/opq/xyz" title="abc" /> 
       <siteMapNode url="/reasonal/opq/pqr" title="pqr" /> 
      </siteMapNode> 
     </siteMapNode> 
    </siteMapNode> 
</siteMap> 

我希望做的就是貫穿整個XML重複檢查哪個節點我的網址,然後遍歷它的兄弟姐妹相匹配。例如,檢查「/ reasonal/opq/pqr」,然後在li中獲得<siteMapNode url="/reasonal/opq/xyz" title="abc" /><siteMapNode url="/reasonal/opq/pqr" title="pqr" />的標題。

我從來沒有寫過xsl之前。根據迄今爲止的學習,我可以循環所有節點並檢查url匹配,但不知道如何將其兄弟包括它在li中的節點。有人可以幫助一些代碼。

+0

您可以在URL爲「/ reasonal/opq/pqr」的情況下顯示您的預期輸出嗎?謝謝! –

回答

0

首先,你可能會定義一個參數,這樣的URL可以傳遞到XSLT

<xsl:param name="url" select="'/reasonal/opq/pqr'" /> 

在這種情況下開始的時候,我已經定義的「/ reasonal/OPQ/PQR的默認值'應該沒有參數傳遞。

然後,選擇的SiteMapNode具有匹配網址屬性元素,你會做以下幾點:

<xsl:apply-templates select="//siteMapNode[@url=$url]" /> 

有一個匹配的的SiteMapNode夫婦的方式來獲得這個兄弟姐妹。如果你想獲得的所有的兄弟姐妹,包括當前的元素,你可以簡單地這樣做

<xsl:apply-templates select="../siteMapNode" mode="list" /> 

(注意,該模式=「名單」,是因爲你最終將有兩個模板匹配的SiteMapNode,所以你需要區分它們)。

如果你不想包含當前元素,你可以做以下任一操作:

<xsl:apply-templates select="../siteMapNode[generate-id() != generate-id(current())]" 
    mode="list" /> 

<xsl:apply-templates select="preceding-sibling::siteMapNode 
    |following-sibling::siteMapNode" 
    mode="list" /> 

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" omit-xml-declaration="yes"/> 
    <xsl:param name="url" select="'/reasonal/opq/pqr'"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="//siteMapNode[@url=$url]"/> 
    </xsl:template> 

    <xsl:template match="siteMapNode"> 
     <ul> 
     <xsl:apply-templates select="../siteMapNode" mode="list"/> 
     </ul> 
    </xsl:template> 

    <xsl:template match="siteMapNode" mode="list"> 
     <li> 
     <a href="{@url}"> 
      <xsl:value-of select="@title"/> 
     </a> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

當適用於您的示例XML,以下是輸出

<ul> 
    <li> 
     <a href="/reasonal/opq/xyz">abc</a> 
    </li> 
    <li> 
     <a href="/reasonal/opq/pqr">pqr</a> 
    </li> 
</ul>