Xslt 用xsl整合结构
这可以在XLST V2.0中完成吗 我有一个编辑器的输出,它以混合顺序提供标记文本。我需要巩固它 给定HTMLXslt 用xsl整合结构,xslt,Xslt,这可以在XLST V2.0中完成吗 我有一个编辑器的输出,它以混合顺序提供标记文本。我需要巩固它 给定HTML 来源: 强调粗体和强调 大胆而有力 目标: 强调粗体和强调 大胆而有力 然而,这些源组合也可能发生,但它们不能 由于并非所有文本都强调、粗体或两者兼而有之,因此应合并: 普通文本强调粗体和强调体 大胆而有力 普通文本,但从para1开始强调并加粗 普通文本,但从para1开始强调并加粗 您当然可以在XSLT/XPath中检查这样的条件,例如para1[子代::text()[norma
来源:
强调粗体和强调
大胆而有力
目标:
强调粗体和强调
大胆而有力
然而,这些源组合也可能发生,但它们不能
由于并非所有文本都强调、粗体或两者兼而有之,因此应合并:
普通文本强调粗体和强调体
大胆而有力
普通文本,但从para1开始强调并加粗
普通文本,但从para1开始强调并加粗
您当然可以在XSLT/XPath中检查这样的条件,例如para1[子代::text()[normalize-space()]中的每个$t满足($t/parent::em或$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>
强调粗体和强调
大胆而有力
进入
强调粗体和强调
大胆而有力
和树叶
<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
)会变得更加困难。如果您首先将发布的示例修复为格式良好的XML,可能会更好(
是空元素,而不是结束标记,即
)然后向我们展示您要为发布的示例创建的结果。好的,编辑了示例您说输入是HTML,但我认为HTML中没有任何para1
或para2
元素。HTML中的em
是一个内联元素,它属于块元素的内部,比如div
或p
,在HTML中,将foobar转换为foobar是没有意义的,因为这不是一个有效的结构,浏览器中的任何纠错HTML解析器在遇到它时都会重新更正该结构。您好,这确实不是纯HTML,但这是我从一个GWT组件的源代码中得到的。我将其进一步转换为另一种格式,这种格式无法理解和类似的HTML标记。目标格式需要在para标记中合并信息。所以问题仍然围绕着原则问题,XSLT能在这种情况下使用吗?
<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>