加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 使用XSLT拆分和展平节点

发布时间:2020-12-16 05:36:01 所属栏目:百科 来源:网络整理
导读:我不能有任何嵌套的跨度,所以我需要展平它们并连接它们的类属性,这样我就可以跟踪哪些类是父类. 这是一个简化的输入: 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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读