如何拆分文本和保留HTML标记(XSLT 2.0)

如何拆分文本和保留HTML标记(XSLT 2.0),第1张

概述我有一个具有描述节点的xml: <config> <desc>A <b>first</b> sentence here. The second sentence with some link <a href="myurl">The link</a>. The <u>third</u> one.</desc></config> 我试图使用点作为分隔符来分割句子,但在HTML输出中同时保留最终的 我有一个具有描述节点的xml:

<config>  <desc>A <b>first</b> sentence here. The second sentence with some link <a href="myurl">The link</a>. The <u>third</u> one.</desc></config>

我试图使用点作为分隔符来分割句子,但在HTML输出中同时保留最终的HTML标记.
到目前为止,我所拥有的是一个分割描述的模板,但由于normalize-space和substring-before函数,HTML标记在输出中丢失.
我目前的模板如下:

<xsl:template name="output-tokens">  <xsl:param name="sourceText" />  <!-- Force a . at the end -->  <xsl:variable name="newList" select="concat(normalize-space($sourceText),' ')" />  <!-- Check if we have really a point at the end -->  <xsl:choose>    <xsl:when test ="contains($newList,'.')">      <!-- Find the first . in the string -->      <xsl:variable name="first" select="substring-before($newList,'.')" />      <!-- Get the remaining text -->      <xsl:variable name="remaining" select="substring-after($newList,'.')" />      <!-- Check if our string is not in fact a . or an empty string -->      <xsl:if test="normalize-space($first)!='.' and normalize-space($first)!=''">        <p><xsl:value-of select="normalize-space($first)" />.</p>      </xsl:if>      <!-- Recursively apply the template for the remaining text -->      <xsl:if test="$remaining">        <xsl:call-template name="output-tokens">          <xsl:with-param name="sourceText" select="$remaining" />        </xsl:call-template>      </xsl:if>    </xsl:when>    <!--If no . was found -->    <xsl:otherwise>      <p>        <!-- If the string does not contains a . then display the text but avoID            displaying empty strings          -->        <xsl:if test="normalize-space($sourceText)!=''">          <xsl:value-of select="normalize-space($sourceText)" />.        </xsl:if>      </p>    </xsl:otherwise>  </xsl:choose></xsl:template>

我以下列方式使用它:

<xsl:template match="config">  <xsl:call-template name="output-tokens">       <xsl:with-param name="sourceText" select="desc" />  </xsl:call-template></xsl:template>

预期的产出是:

<p>A <b>first</b> sentence here.</p><p>The second sentence with some link <a href="myurl">The link</a>.</p><p>The <u>third</u> one.</p>
解决方法 以下是使用XSLT 2实现第二种方法 suggested by Michael Kay的一种方法.

此样式表演示了两遍转换,其中第一遍引入< stop />每个句子和第二遍之后的标记包含以< stop />结尾的所有组.在段落中.

<xsl:stylesheet version="2.0"                 xmlns:xsl="http://www.w3.org/1999/XSL/transform">  <xsl:output method="xml" indent="yes"/>  <!-- two-pass processing -->  <xsl:template match="/">    <xsl:variable name="intermediate">      <xsl:apply-templates mode="phase-1"/>    </xsl:variable>    <xsl:apply-templates select="$intermediate" mode="phase-2"/>  </xsl:template>  <!-- IDentity transform -->  <xsl:template match="@*|node()" mode="#all" priority="-1">    <xsl:copy>      <xsl:apply-templates select="@*|node()" mode="#current"/>    </xsl:copy>  </xsl:template>  <!-- phase 1 -->  <!-- insert <stop/> "milestone markup" after each sentence -->  <xsl:template match="text()" mode="phase-1">    <xsl:analyze-string select="." regex="\.\s+">      <xsl:matching-substring>        <xsl:value-of select="regex-group(0)"/>        <stop/>      </xsl:matching-substring>      <xsl:non-matching-substring>        <xsl:value-of select="."/>      </xsl:non-matching-substring>    </xsl:analyze-string>  </xsl:template>  <!-- phase 2 -->  <!-- turn each <stop/>-terminated group into a paragraph -->  <xsl:template match="*[stop]" mode="phase-2">    <xsl:copy>      <xsl:for-each-group select="node()" group-ending-with="stop">        <p>          <xsl:apply-templates select="current-group()" mode="#current"/>        </p>      </xsl:for-each-group>    </xsl:copy>  </xsl:template>  <!-- remove the <stop/> markers -->  <xsl:template match="stop" mode="phase-2"/></xsl:stylesheet>
总结

以上是内存溢出为你收集整理的如何拆分文本和保留HTML标记(XSLT 2.0)全部内容,希望文章能够帮你解决如何拆分文本和保留HTML标记(XSLT 2.0)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1083803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存