我对xslt(2.0)相当新,我遇到了一个棘手的问题。基本上我有一个格式错误的html文件,如下所示:
<html>
<body>
<p> text 1 </p>
<div> <p> text 2</p> </div>
<p> Here is a list
<ul>
<ol>
<li> ListItem1 </li>
<li> ListItem1 </li>
</ol>
<dl>
<li> dl item </li>
<li> dl item2 </li>
</dl>
</ul>
<div>
<p> I was here</p>
</div>
</p>
</body>
</html>
我正在尝试将其放入一个格式良好的XML文件中。在我的xslt文件中,我递归地检查p或div的所有子项是否是其他p或div并且只是提升它们,否则我将它们用作独立段落。我扩展了这个想法,以便如果带有子列表的p或div显示正确,但不提升列表中的子项。
我遇到的一个问题是我得到的输出xml是以下
<?xml version="1.0" encoding="utf-8"?><html>
<body>
<p> text 1 </p>
<p> text 2</p>
Here is a list
<ul>
<ol>
<li> ListItem1 </li>
<li> ListItem1 </li>
</ol>
<dl>
<li> dl item </li>
<li> dl item2 </li>
</dl>
</ul>
<p> I was here</p>
</body>
</html>
“这是一个列表”也需要在段落标签中!我疯了试图解决这个问题...... 任何输入/链接都将非常感激。
答案 0 :(得分:1)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"div[descendant::div or descendant::p]
|
p[descendant::div or descendant::p]
">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match=
"div[descendant::div or descendant::p]/text()
|
p[descendant::div or descendant::p]/text()
">
<xsl:element name="{name(..)}"
namespace="{namespace-uri(..)}">
<xsl:copy-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时,会生成所需的正确输出:
<html>
<body>
<p> text 1 </p>
<p> text 2</p>
<p> Here is a list
</p>
<ul>
<ol>
<li> ListItem1 </li>
<li> ListItem1 </li>
</ol>
<dl>
<li> dl item </li>
<li> dl item2 </li>
</dl>
</ul>
<p> I was here</p>
</body>
</html>