<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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)