2012-04-24 61 views
1

嗨我正在尋找一個XSLT來生成HTML,如下所示。 以下是轉換的詳細信息。 請提供您的意見。XML到HTML的XSLT

對於每個PageGroup我需要創建一個

In HTML an Li element should be populated. 

    <li> 
     <a>Test</a> 
    </li> 

And under each Pagegroup for every Page Ul should be populated. 
<ul> 
     <li> 
      <a>Test Role 1</a> 
     </li> 
     <li> 
      <a>Test Role 2</a> 
     </li> 
</ul> 

XML:

<menuitems> 
    <pagegroup title="Test"> 
     <pages id="1" url="Test1.aspx" description="Tes 1" type="1" role="Test Role 1"/> 
     <pages id="2" url="Test2.aspx" description="Tes 2" type="1" role="Test Role 2"/> 
     <pagegroup title="Projects"> 
      <pages id="4" url="Test 2 3.aspx" description="Test 2 3" type="1" role="Rol 3"/> 
      <pages id="4" url="Test 2 5.aspx" description="Test 2 5" type="1" role="Rol 4"/> 
     </pagegroup> 
    </pagegroup> 
</menuitems> 

輸出HTML期待

<ul> 
    <li> 
     <a>Test</a> 
    </li> 
    <ul> 
     <li> 
      <a>Test Role 1</a> 
     </li> 
     <li> 
      <a>Test Role 2</a> 
     </li> 
     <ul> 
      <li> 
       <a>Projects</a> 
      </li> 
      <ul> 
       <li> 
        <a>Test 2 3</a> 
       </li> 
       <li> 
        <a>Test 2 5</a> 
       </li> 
      </ul> 
     </ul> 
    </ul> 
</ul> 

XSLTŧ ried

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
      <xsl:template match="pagegroup"> 
         <ul> 
            <xsl:apply-templates select="pages"/> 
            <li> 
            <xsl:value-of select="@title"/> 
            </li> 
         </ul> 
      </xsl:template> 
      <xsl:template match="pages"> 
         <li> 
            <xsl:value-of select="@role"/> 
            <xsl:if test="pagegroup"> 
               <ul> 
                  <xsl:apply-templates select="pages"/> 
                  <li> 
                  <xsl:value-of select="@title" /> 
                  </li> 
               </ul> 
            </xsl:if> 
         </li> 
      </xsl:template> 
</xsl:stylesheet> 
+0

什麼根據你的結構,你會需要一個遞歸的模板,這將遍歷所有pagegroups到創建LIS。 – 2012-04-24 09:48:22

+0

你是你的實際產出? – 2012-04-24 09:53:54

回答

2

你不是太遙遠。主要的問題是,在你的模板來匹配pagegroup你這樣做......

<xsl:apply-templates select="pages"/> 

當你真正想要做這個,同時匹配頁面pagegroups

<xsl:apply-templates/> 

試試下面的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="pagegroup"> 
     <ul> 
     <li> 
      <xsl:value-of select="@title"/> 
     </li> 
     <ul> 
      <xsl:apply-templates/> 
     </ul> 
     </ul> 
    </xsl:template> 
    <xsl:template match="pages"> 
     <li> 
     <xsl:value-of select="@role"/> 
     </li> 
    </xsl:template> 
</xsl:stylesheet> 

當應用到您的XML,以下是輸出

<ul> 
    <li>Test</li> 
    <ul> 
     <li>Test Role 1</li> 
     <li>Test Role 2</li> 
     <ul> 
     <li>Projects</li> 
     <ul> 
      <li>Rol 3</li> 
      <li>Rol 4</li> 
     </ul> 
     </ul> 
    </ul> 
</ul> 
1

你有點想你想要什麼,我想。

這變得越來越近,但你仍然不會得到你想要的東西,就像在你想要扮演角色的一組頁面中一樣,並且在另一個描述中。這是可能的,但我不知道這是你想要

<?xml version="1.0" encoding="ISO-8859-1"?> 

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

     <xsl:template match="pagegroup"> 
      <ul> 
       <li> 
        <a><xsl:value-of select="@title"/></a> 
       </li> 
       <xsl:if test="pages | pagegroup"> 
        <ul> 
         <xsl:apply-templates select="pages | pagegroup"/> 
        </ul> 
       </xsl:if> 

      </ul> 
     </xsl:template> 

     <xsl:template match="pages"> 
      <li> 
       <a><xsl:value-of select="@role"/></a> 
       <xsl:if test="pagegroup"> 
        <ul> 

         <li> 
          <xsl:value-of select="@title" /> 
         </li> 
        </ul> 
       </xsl:if> 
      </li> 
     </xsl:template> 
    </xsl:stylesheet>