我正在寻找一种快速简便的方法来使用XSLT 1.0转换他的XML(类似于XHTML):
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head/>
<body>
<div>Hello<a href="http://google.com">this is the first</a>line.<p>This the second.<br/>And this the third one.</p></div>
</body>
</html>
到这一个:
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head/>
<body>
<div>
<p>Hello<a href="http://google.com">this is the first</a>line.</p>
<p>This the second.</p>
<p>And this the third one.</p>
</div>
</body>
</html>
我在想XSLT 1.0中的树木行走算法。复杂的是,例如随附的<a>
个链接。并且不应删除现有的<p>
。
愿有人帮我这个吗?非常感谢。
答案 0 :(得分:5)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" 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[text() and p]">
<div>
<p>
<xsl:apply-templates select="node()[not(self::p or preceding-sibling::p)]"/>
</p>
<xsl:apply-templates select="p | p/following-sibling::node()"/>
</div>
</xsl:template>
<xsl:template match="p[text() and br]">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match=
"p/text()
[preceding-sibling::node()[1][self::br]
or
following-sibling::node()[1][self::br]
]">
<p><xsl:value-of select="."/></p>
</xsl:template>
<xsl:template match="p/br"/>
</xsl:stylesheet>
应用于提供的XML文档:
<html>
<head/>
<body>
<div>Hello
<a href="http://google.com">this is the first</a>line.
<p>This the second.<br/>And this the third one.</p>
</div>
</body>
</html>
生成想要的正确结果:
<html>
<head/>
<body>
<div>
<p>Hello
<a href="http://google.com">this is the first</a>line.
</p>
<p>This the second.</p>
<p>And this the third one.</p>
</div>
</body>
</html>