使用xsl整合结构

时间:2015-10-30 10:53:54

标签: xslt

可以在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级别。因为输出可能有许多类似的标记文本,具体取决于它是如何制作的。

这是可能的还是要求和标签始终以相同的顺序出现?

1 个答案:

答案 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>

不变。当然,同时处理embold等各种元素变得更加困难。