使用XSLT转换XML数据

使用XSLT转换XML数据,xslt,Xslt,我的分数如下 <ul> <li>this is bullet list</li> <li>this is another bullet</li> <ul> <li>this is embaded</li> <li>this

我的分数如下

       <ul>
              <li>this is bullet list</li>
              <li>this is another bullet</li>
              <ul>
                  <li>this is embaded</li>
                  <li>this is embaded</li>
                     <ul>
                        <li>this is furthur embaded</li>
                     </ul>
               </ul>
        </ul>
  • 这是子弹清单
  • 这是另一颗子弹
    • 这是大使馆
    • 这是大使馆
      • 这是进一步的
我需要一个xslt脚本来转换为

<xml>
   <unorderlist>
   <list><text>this is bullet list</text></list>
   <list><para><text>this is another bullet</text>
     <unorderlist>
       <list><text>this is embaded</text></list>
       <list><para><text>this is embaded</text>
           <unorderlist>
              <list><text>this is furthur embabed</text></list>
            </unorderlist>
           </para></list>
        </unorderlist>
     </para>
   </list>
</unorderlist>
</xml>

这是子弹清单
这是另一颗子弹
这是大使馆
这是大使馆
这是弗图尔酒店
基本上,所有嵌套项都应该出现在最后一个节点标记中。任何提示都将不胜感激。

例如

<xsl:template match="/">
  <xml>
    <xsl:apply-templates/>
  </xml>
</xsl:template>

<xsl:template match="ul">
  <unorderlist>
    <xsl:apply-templates select="li"/>
  </unorderlist>
</xsl:template>

<xsl:template match="li">
  <list>
    <xsl:choose>
      <xsl:when test="following-sibling::*[1]/self::ul">
        <para>
          <text>
            <xsl:apply-templates/>
          </text>
          <xsl:apply-templates select="following-sibling::*[1]/self::ul"/>
        </para>
      </xsl:when>
      <xsl:otherwise>
        <text>
          <xsl:apply-templates/>
        </text>
      </xsl:otherwise>
    </xsl:choose>
  </list>
</xsl:template>


如果您想支持更复杂的输入,请使用单独的模式将
拉到前面的
  • 谢谢Jelovirt,我刚刚又提出了一个senerio,在Embeddead元素中使用OL而不是ul。?如何抓住这一点和过程?如何处理OL和OL或组合。我的标记是使用freetextbox html编辑器生成的,因此在某些浏览器中,标记是生成为OL,UL,LI,其中一些浏览器是生成为OL,UL,LI?有什么办法可以消除这种情况的敏感性吗?@atif:最简单的方法是将
    li
    改为
    li
    ,等等,并将
    以下兄弟姐妹::*[1]/self::ul
    改为
    以下兄弟姐妹::*[1][self::ul或self::ul]
    ,谢谢Jelovirt,我刚刚想出了一个新的senerio,我用OL代替了。遗憾的是,我担心在您完整地陈述您的需求之前,您会提出更多的场景。我建议您在尝试编写代码(或要求他人为您编写代码)之前,花一些精力更精确地定义需求。