我有以下问题。 我有一个像这样的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完成此操作?
答案 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>