可以在XLST V2.0中完成吗
我有一个编辑器的输出,它以混合顺序提供标记文本。我需要巩固它。
给出HTML
source:
<para1>
<para2>
<em>emphazised <bold>bolded and emphazised</bold></em>
</para2>
<para2>
<bold><em>bolded and emphazised</em></bold>
</para2>
</para1>
target:
<para1>
<em>
<para2>
emphazised <bold>bolded and emphazised</bold>
</para2>
<para2>
<bold>bolded and emphazised</bold>
</para2>
</em>
</para1>
However theese source combination can occur as well but they cannot
be consolidated as they are mixed within<para1> as not all text is emphazised, bolded or both:
<para1>
<para2>
normal text <em>emphazised</em> <bold>bolded<em> and emphazised</em></bold>
</para2>
<para2>
<bold>bolded<em> and emphazised</em></bold>
</para2>
</para1>
<para1>
<em><bold>
<para2>
normal text but emphazied and bolded from para1
</para2>
<para2>
normal text but emphazied and bolded from para1
</para2>
</em></bold>
</para1>
<em>
和<bold>
标记可以按任何顺序显示在彼此之内
<em>
和<bold>
可以同时显示<para1>
和<para2>
级
然后可以确定:
对于每个<para1>
,有任何文字不在<em>
标记或<bold>
标记中。
对于每个<para1>
,是否有任何文本都不在<em>
代码和<bold>
代码中
以及每个<para2>
的类似问题?
目的是能够将具有相同标签的内容融合到较少数量的标签中,并且如果所有para2标签都相似,则将标签移动到para1级别。因为输出可能有许多类似的标记文本,具体取决于它是如何制作的。
这是可能的还是要求和标签始终以相同的顺序出现?
答案 0 :(得分:0)
您当然可以在XSLT / XPath中检查这样的条件,例如para1[every $t in descendant::text()[normalize-space()] satisfies ($t/parent::em or $t/../parent::em)]
会检查para1
的任何非空白文本节点后代是否有em
父级或祖父级。基于此,您可以编写类似
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@*|node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="para1[every $t in descendant::text()[normalize-space()] satisfies ($t/parent::em or $t/../parent::em)]">
<xsl:copy>
<em>
<xsl:apply-templates mode="strip"/>
</em>
</xsl:copy>
</xsl:template>
<xsl:template match="em" mode="strip">
<xsl:apply-templates/>
</xsl:template>
</xsl:transform>
转换
<?xml version="1.0" encoding="UTF-8"?>
<para1>
<para2>
<em>emphazised <bold>bolded and emphazised</bold></em>
</para2>
<para2>
<bold><em>bolded and emphazised</em></bold>
</para2>
</para1>
进入
<?xml version="1.0" encoding="UTF-8"?><para1><em>
<para2>
emphazised <bold>bolded and emphazised</bold>
</para2>
<para2>
<bold>bolded and emphazised</bold>
</para2>
</em></para1>
并离开
<para1>
<para2>
normal text <em>emphazised</em> <bold>bolded<em> and emphazised</em></bold>
</para2>
<para2>
<bold>bolded<em> and emphazised</em></bold>
</para2>
</para1>
不变。当然,同时处理em
或bold
等各种元素变得更加困难。