2011-05-12 38 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>