XSLT-将模板标记为斜体和粗体XML元素文本
我在XSLT中实现了以下标记化模板XSLT-将模板标记为斜体和粗体XML元素文本,xml,xslt,tokenize,Xml,Xslt,Tokenize,我在XSLT中实现了以下标记化模板 <xsl:template match="sporting_arena/text()[normalize-space()]" name="split"> <xsl:param name="pText" select="."/> <xsl:if test="normalize-space($pText)"> <li> <xsl:call-template name="replace">
<xsl:template match="sporting_arena/text()[normalize-space()]" name="split">
<xsl:param name="pText" select="."/>
<xsl:if test="normalize-space($pText)">
<li>
<xsl:call-template name="replace">
<xsl:with-param name="pText" select="substring-before(concat($pText, ';'), ';')"/>
</xsl:call-template>
</li>
<xsl:call-template name="split">
<xsl:with-param name="pText" select="substring-after($pText, ';')"/>
</xsl:call-template>
</xsl:if>
我想知道是否有可能在这个标记化系统中添加这样一种功能,即使用相同的分隔符方法将XML元素文本中的某些单词加粗或斜体,并在单词的每一侧使用分隔符来指示加粗或斜体
当前系统的XML示例:
<sporting_arena>
Adelaide Oval: An awesome new bike and truck that drove up* a hill and never came back.;
The delimiter I choose here * places this text on a new line and now I'm;
On a new dot point.
</sporting_arena>
阿德莱德椭圆形:一辆很棒的新自行车和卡车,开上了一座小山,再也没有回来过。;
我在这里选择的分隔符*将此文本放在新行上,现在我是;
在一个新的点上。
“我想知道是否有可能在这个标记化系统中添加
能够将XML元素文本中的某些单词加粗或斜体
使用相同的分隔符方法,并在
表示粗体或斜体的单词。”
是的,这是可能的。此时,您应该能够自己实现这一点,使用与标记化模板(您称之为“拆分”)使用的相同原则。创建标记为
的令牌与创建标记为
或
的令牌没有区别
编辑: 回应:
“我认为有一点不同:将文本划分为
li
元素,每个文本片段最终都会在列表中结束
项,并且分隔符;
标记列表项应结束和结束的位置
另一个立即开始。相反,粗体或斜体标记
仅适用于起始和结束之间的文本部分
分隔符。”
所需的更改相当微不足道。考虑下面的例子:
<xsl:template name="italic">
<xsl:param name="text"/>
<xsl:param name="delimiter" select="'*'"/>
<xsl:choose>
<xsl:when test="contains($text, $delimiter) and contains(substring-after($text, $delimiter), $delimiter)">
<xsl:value-of select="substring-before($text, $delimiter)"/>
<i>
<xsl:value-of select="substring-before(substring-after($text, $delimiter), $delimiter)"/>
</i>
<!-- recursive call -->
<xsl:call-template name="italic">
<xsl:with-param name="text" select="substring-after(substring-after($text, $delimiter), $delimiter)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
当此模板被称为:
<p>
<xsl:call-template name="italic">
<xsl:with-param name="text" select="input"/>
</xsl:call-template>
</p>
输入为:
<input>Lorem ipsum *dolor* sit amet, *consectetuer* adipiscing * elit.</input>
Lorem ipsum*dolor*sit amet,*concetetuer*adipsing*elit。
结果将是:
<p>Lorem ipsum <i>dolor</i> sit amet, <i>consectetuer</i> adipiscing * elit.</p>
Lorem ipsum door sit amet,继续前进*精英
请注意,最后一个奇数分隔符按原样传递给输出
通过参数化要创建的标记元素的名称,可以将此模板概括为处理其他类型的标记(例如,粗体)
--P.S.此解决方案自豪地使用了
xsl:choose
xsl:choose
是XSLT语言不可分割的一部分,充分利用它绝对没有错。它增加了代码的清晰度,而人为避免使用它只会使代码变得不必要。我认为有一点不同:当将文本划分为li
元素时,文本的每个片段最终都会进入一个列表项,而分隔符代码>标记列表项应在哪里结束,另一个立即开始。相反,粗体或斜体标记只适用于起始分隔符和结束分隔符之间的文本部分。我很难实现这一点。我相信我只能在split中调用一个模板,否则它会输出两次XML元素。我是否必须以某种方式组合替换和斜体化模板,这样我只需在拆分模板的中调用一个模板,而不会在拆分模板的中调用替换和斜体化时产生双重输出。您需要连续调用模板。上层模板中的每个令牌都需要按顺序发送到下一个模板。这是假设您没有将粗体嵌套在斜体中,而将斜体嵌套在粗体中,否则会变得更复杂。
<p>Lorem ipsum <i>dolor</i> sit amet, <i>consectetuer</i> adipiscing * elit.</p>