【发布时间】:2012-04-25 23:10:23
【问题描述】:
这是 XSL 中的一段代码,它将文本标记为由标点符号和类似字符分隔的片段。我想问一下是否有可能以某种方式捕获文本被标记的字符串,例如逗号或点等。
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs xdt err fn" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:err="http://www.w3.org/2005/xqt-errors" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="GENERUJ">
<TEXT>
<xsl:variable name="text">
<xsl:value-of select="normalize-space(unparsed-text(@filename, 'UTF-8'))" disable-output-escaping="yes"/>
</xsl:variable>
<xsl:for-each select="tokenize($text, '(\s+("|\(|\[|\{))|(("|,|;|:|\s\-|\)|\]|\})\s+)|((\.|\?|!|;)"?\s*)' )">
<xsl:choose>
<xsl:when test="string-length(.)>0">
<FRAGMENT>
<CONTENT>
<xsl:value-of select="."/>
</CONTENT>
<LENGTH>
<xsl:value-of select="string-length(.)"/>
</LENGTH>
</FRAGMENT>
</xsl:when>
<xsl:otherwise>
<FRAGMENT_COUNT>
<xsl:value-of select="last()-1"/>
</FRAGMENT_COUNT>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</TEXT>
</xsl:template>
当您看到构建的标签 CONTENTS、LENGTH 时,如果您明白我的意思,我想添加一个名为 SEPARATOR 的标签。我在互联网上找不到任何答案,而且我只是 xsl 转换的初学者,所以我正在寻找一个快速的解决方案。提前谢谢你。
【问题讨论】:
-
您能否包含一些简化的示例输入和预期输出?就目前而言,您的问题还不够清楚。
-
一般要点:不要使用
<xsl:variable name="x"><xsl:value-of select="s"/></xsl:variable>。而是使用<xsl:variable name="x" select="s"/>。它不仅不那么冗长,而且效率更高。 -
Hmm.. 如果它有助于输入(变量“文本”)将是
Blah blah blah, blah blah (blah blah) blah.形式的文本文件和所需的输出类似于<TEXT><FRAGMENT><CONTENT>Blah blah blah</CONTENT><LENGTH>14</LENGTH><SEPARATOR>,</SEPARATOR></FRAGMENT>...等等......和迈克尔,我尝试使用您的建议,但是如果您向左滚动,则有一个disable-output-escaping="yes"属性,当我将其放入xsl:variable标记时,它会给我一个错误