2011-05-12 40 views
2

開始我有下面這樣的XMLXSLT1:轉換XML節點HTML列表,從最深的節點首先

<root> 
     <s> 
      <name>self-1</name> 
      <parents> 
       <s> 
        <name>p-1-2</name> 
        <parents> 
         <s> 
          <name>p-1-2-1</name> 
          <parents> 
           <s> 
            <name>p-1-2-1-1</name> 
           </s> 
          </parents> 
         </s> 
         <s> 
          <name>p-1-2-2</name> 
         </s> 
        </parents> 
       </s> 
      </parents> 
     </s> 
    </root> 

,我需要寫一個xslt1來解析XML產生類似以下的輸出,我們的目標首先處理所有父節點,最後處理節點self-1。請給我一些建議。

<ul> 
    <li>p-1-2-1-1</li> 
    <ul> 
     <li>p-1-2-1</li> 
     <li>p-1-2-2</li> 
     <ul> 
      <li>p-1-2</li> 
      <ul> 
       <!-- self --> 
       <li>self-1</li> 
      </ul> 
     </ul> 
    </ul> 
</ul> 

回答

1

下面是我對如何解決建議:

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="descendant::parents[not(s/parents)]"/> 
    </xsl:template> 

    <xsl:template match="parents | root"> 
    <ul> 
     <xsl:apply-templates select="s/name"/> 
     <xsl:variable name="p" select="parent::s/parent::parents | parent::s/parent::root"/> 
     <xsl:if test="$p"> 
     <li> 
      <xsl:apply-templates select="$p"/> 
     </li> 
     </xsl:if> 
    </ul> 
    </xsl:template> 

    <xsl:template match="name"> 
    <li> 
     <xsl:value-of select="."/> 
    </li> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<ul> 
    <li>p-1-2-1-1</li> 
    <li> 
     <ul> 
     <li>p-1-2-1</li> 
     <li>p-1-2-2</li> 
     <li> 
      <ul> 
       <li>p-1-2</li> 
       <li> 
        <ul> 
        <li>self-1</li> 
        </ul> 
       </li> 
      </ul> 
     </li> 
     </ul> 
    </li> 
</ul> 

這不完全是你問什麼,但畢竟是有意這樣做的:你的樣品有ul元素與ul孩子,但這是不允許的HTML(http://www.w3.org/TR/html4/struct/lists.html#h-10.2)。所以我的樣式表通過確保任何ul只有li子元素來確保結果是有效的HTML。

+0

非常感謝馬丁,我完全忘了,我可以使用後代軸的 – jjennifer 2011-05-12 14:02:28

0

處理multile節點<s>

我的模板<xsl:template match="parents | root">更新,以類似下面:

<xsl:template match="parents | root"> 
     <ul> 
      <xsl:apply-templates select="s/name"/> 
      <xsl:choose> 
       <xsl:when test="parent::s/parent::parents"> 
        <xsl:variable name="p" select="parent::s/parent::parents"/> 
        <li><xsl:apply-templates select="$p"/></li> 
       </xsl:when> 

       <xsl:when test="parent::s/parent::root"> 
        <xsl:variable name="p" select="parent::s/parent::root"/> 
        <li><xsl:apply-templates select="$p"/></li> 
       </xsl:when> 
      </xsl:choose> 
     </ul> 
    </xsl:template>