从新节点覆盖现有节点的text()节点 - XSLT

时间:2015-10-05 04:27:58

标签: xml xslt xslt-2.0

我正在进行HTML转换为xml。在html中我有这样的表,

<doc>
<ol>
    <li>
        <p>List<span style="color: rgb(255,0,255);">The scope of this project is to:</span></p>
        <ol>
            <li>nested list1</li>
            <li>nested <span style="color: rgb(255,0,255);">The scope of this project is to:</span> list1</li>
            <li>nested list1</li>
            <li>nested list1</li>
            <li>nested list1</li>
        </ol>
    </li>
    <li>
        <p>List<span style="color: rgb(255,0,255);">The scope of this project is to:</span></p>
    </li>
    <li>
        <p>List<span style="color: rgb(255,0,255);">The scope of this project is to:</span></p>
    </li>
</ol>

这里我需要将html元素名称转换为某些xml元素名称,并且应该通过<para>元素覆盖文本内容。

所以我的输出应该是,

<doc>
    <oli>
        <listitem><para>List<style type="color: rgb(255,0,255);">The scope of this project is to:</style></para>
            <oli>
                <listitem><para>nested list1</para></listitem>
                <listitem><para>nested <style type="color: rgb(255,0,255);">The scope of this project is to:</style> list1</para></listitem>
                <listitem><para>nested list1</para></listitem>
                <listitem><para>nested list1</para></listitem>
                <listitem><para>nested list1</para></listitem>
            </oli>
        </listitem>
        <listitem><para>
            List<style type="color: rgb(255,0,255);">The scope of this project is to:</style>
        </para></listitem>
        <listitem><para>
            List<style type="color: rgb(255,0,255);">The scope of this project is to:</style>
        </para></listitem>
    </oli>
</doc>

我写了以下xsl来将html转换为xml,

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

    <xsl:template match="li">
        <listitem>
            <para>
                <xsl:apply-templates/>
            </para>
        </listitem>
    </xsl:template>

    <xsl:template match="span">
        <style type="{@style}">
            <xsl:apply-templates/>
        </style>
    </xsl:template>

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

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

我遇到的问题是当ul包含嵌套列表时,li包含嵌套列表的文本未被<para>元素正确覆盖。

在上面的示例中,我为嵌套列表获得的currunt输出是follwos,

<listitem><para>
            List<style type="color: rgb(255,0,255);">The scope of this project is to:</style>
            <oli>
                <listitem><para>nested list1</para></listitem>
                <listitem><para>nested <style type="color: rgb(255,0,255);">The scope of this project is to:</style> list1</para></listitem>
                <listitem><para>nested list1</para></listitem>
                <listitem><para>nested list1</para></listitem>
                <listitem><para>nested list1</para></listitem>
            </oli>
        </para></listitem>

如此简单,而不是

<listitem><para>
                List<style type="color: rgb(255,0,255);">The scope of this project is to:</style>
                <oli>
              ........
                </oli>
             </para>
 </listitem>

我需要,

    <listitem><para>
           List<style type="color: rgb(255,0,255);">The scope of this project is to:</style>
           </para>
                    <oli>
                  ........
                    </oli>

     </listitem>

我试图通过text()覆盖li元素的<para>内容,但后来<span>元素没有出现在输出中。

任何人都可以建议一种方法我该怎么做..

1 个答案:

答案 0 :(得分:1)

我只想更改模板:

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

为:

<xsl:template match="li[p]">
   <listitem>
     <xsl:apply-templates/>
   </listitem>
</xsl:template>

此模板将与包含<li>的{​​{1}}匹配。在这种情况下,您不必添加一些<p>。对于包含某些<para>的{​​{1}},其他模板将匹配,并且输出所需的<li>

或者,您也可以这样做:

  • 放弃模板<p>
  • 修改模板<para>,如下所示:

    <xsl:template match="li/p">