通过XSLT从XML中删除空标签并向上冒泡元素

时间:2017-10-16 16:06:45

标签: xml xslt

我有以下问题。 我有一个像这样的xml文件

<p>
    <span class="dateline">City</span><p>
        <p>
            <em>City.</em>some text
        </p>
    </p><p>
        <p/>
    </p>
    [... unknown number of other nested paragraphs with text ...]
</p>

我希望它看起来像那样:

<p>
    <span class="dateline">City</span>
    <em>City.</em>some text
</p>

所以我必须转到每个叶子p-tag并将其中的所有内容移动到父p-tag中,只要有父p标签即可。 之后我会删除所有空的p-tag。

如何使用xslt 1.0完成此操作?

2 个答案:

答案 0 :(得分:1)

我会写一个身份转换(如果你不知道那是什么,请查看它值得学习),然后为段落添加两个模板:一个用match="p"来匹配{{1没有嵌套在其他p元素中的元素,以及一个与p匹配的元素。第一个模板只是对标识模板的明确重述(也就是说,可以在不更改功能的情况下省略模板;我只包括它以使所有段落的处理显式化)。第二个省略了match="p[ancestor::p]"指令,只是将模板应用于所有孩子。

答案 1 :(得分:0)

<!-- This template preserve all elements without template -->   

<xsl:template match="*">
    <xsl:copy>
        <xsl:copy-of select="@*"/>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>


<!-- This template remove all elements without childs (you can replace * by p)-->
<xsl:template match="*[not(node())]"/>
<!-- This template remove p inside other p but preserve all childs --> 
<xsl:template match="p[parent::p]">
    <xsl:apply-templates />
</xsl:template>