XSLT-将模板标记为斜体和粗体XML元素文本

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">

我在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: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>