我不能有任何嵌套的跨度,所以我需要展平它们并连接它们的类属性,这样我就可以跟踪哪些类是父类.
这是一个简化的输入:
<body> <h1 class="section">Title</h1> <p class="main"> ZZZ <span class="a"> AAA <span class="b"> BBB <span class="c"> CCC <preserveMe> eeee </preserveMe> </span> bbb <preserveMe> eeee </preserveMe> </span> aaa </span> </p> </body>
这是所需的输出
<body> <h1 class="section">Title</h1> <p class="main"> ZZZ <span class="a"> AAA </span> <span class="ab"> BBB </span> <span class="abc"> CCC <preserveMe> eeee </preserveMe> </span> <span class="ab"> bbb <preserveMe> eeee </preserveMe> </span> <span class="a"> aaa </span> </p> </body>
这是我最接近的(我真的很陌生,所以即使这样做也花了很长时间……)
<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="/"> <p> <xsl:apply-templates/> </p> </xsl:template> <xsl:template match="*/span"> <span class='{concat(../../@class,../@class,@class)}'> <xsl:value-of select='.'/> </span> <xsl:apply-templates/> </xsl:template> </xsl:stylesheet>
您可以看到我尝试失败的结果,以及如果您自己运行它,它与我真正想要的距离有多远.理想情况下,我想要一个接受任意数量嵌套级别的解决方案,并且还可以处理间断的嵌套(span,span,notSpan,span …).
编辑:我在下面的评论者的请求中为嵌套结构添加了标签.另外,我正在使用XSLT v1.0,但如果需要,我可以使用其他版本.
编辑2:我意识到,与我实际需要转换的内容相比,我的示例过于简单化了.也就是说,我不能丢失其他标签的课程;只有跨度可以组合.
正如我在开场评论中提到的,这远远不是微不足道的.这是您可以考虑的另一种方法:
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="p"> <xsl:copy> <xsl:apply-templates select="@*|node()|.//span/text()"/> </xsl:copy> </xsl:template> <xsl:template match="span/text()"> <span> <xsl:attribute name="class"> <xsl:for-each select="ancestor::span"> <xsl:value-of select="@class"/> </xsl:for-each> </xsl:attribute> <xsl:apply-templates select="preceding-sibling::*"/> <xsl:value-of select="." /> <xsl:if test="not(following-sibling::text())"> <xsl:apply-templates select="following-sibling::*"/> </xsl:if> </span> </xsl:template> <xsl:template match="span"/> </xsl:stylesheet>
这在很大程度上类似于Lingamurthy CS之前提出的建议 – 但您将看到以下测试输入的不同之处:
XML
<body> <h1 class="section">Title</h1> <p class="main"> ZZZ <preserveMe>0</preserveMe> <span class="a"> AAA <span class="b"> BBB <span class="c"> CCC <preserveMe>c</preserveMe> </span> bbb <preserveMe>b</preserveMe> </span> aaa </span> <preserveMe>1</preserveMe> </p> </body>