使用文本,内联和段落元素转换列表元素

时间:2016-06-14 10:59:27

标签: xml xslt

我尝试将我的List Element从html转换为xml。 问题是List元素包含段落元素,有时第一个音符是Text。 我将使用apply-templates命令复制段落,并将第一个文本注释嵌套到p标记中。 所以问题是,第一个文本节点也可能包含内联标签,如a,span或img。 所以,我想我需要这样的东西。 如果第一个音符是文本音符,则将所有内容复制到下一个p标记到单独的p标记中。

这是我的源代码

    <li> Text1<span>Text</span>Test<img src=".."><a>text</a> 
<p>Text2</p> 
</li> 

它应该是这样的样子

    <li> 
<p>Text1<span>Text</span>Test<img src=".."><a>text</a></p> 
<p>Text2</p> 
</li>

我的xlst就是这个

<xsl:template match="li/text()">
    <p>
        <xsl:value-of select="."/>
    </p> 
</xsl:template>

这个xlst的结果是错误的

<li>
<p>Text1</p>
<span>Text</span>
<p>Test</p>
<img src=".."><a>text</a>
 <p>Text2</p> 
</li> 

有可能这样做吗?

1 个答案:

答案 0 :(得分:0)

  

所以,我想我需要这样的东西。如果第一个音符是文本音符,则将所有内容复制到下一个p标记到单独的p标记

尝试这样的事情:

<xsl:template match="li">
    <xsl:variable name ="pn" select="p[1]/preceding-sibling::node()" />
    <xsl:if test="$pn" >
        <p>
            <xsl:copy-of select="$pn"/>
        </p>
    </xsl:if>
    <xsl:copy-of  select="p[1]"/>
    <xsl:copy-of  select="p[1]/following-sibling::node()"/>
</xsl:template>

上述模板将第一个p元素之前的所有内容复制到新的p元素中,并复制剩余的节点(第一个p及其后的所有内容)。