xml – 使用XSLT拆分和展平节点
发布时间:2020-12-15 23:57:29 所属栏目:百科 来源:网络整理
导读:我不能有任何嵌套的跨度,所以我需要展平它们并连接它们的类属性,这样我就可以跟踪哪些类是父类. 这是一个简化的输入: body h1 class="section"Title/h1 p class="main" ZZZ span class="a" AAA span class="b" BBB span class="c" CCC preserveMe eeee /pre
我不能有任何嵌套的跨度,所以我需要展平它们并连接它们的类属性,这样我就可以跟踪哪些类是父类.
这是一个简化的输入: <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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |