2012-04-25 68 views
1

这里是XSL中的一段代码,它将文本标记为由函数间和类似字符分隔的片段。我想询问是否有以某种方式捕捉该文本被标记化的字符串的可能性,例如逗号或点等XSLT标记化 - 捕获分隔符

<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+(&quot;|\(|\[|\{))|((&quot;|,|;|:|\s\-|\)|\]|\})\s+)|((\.|\?|!|;)&quot;?\s*)')"> 
      <xsl:choose> 
       <xsl:when test="string-length(.)&gt;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> 

正如你所看到的构建标签内容长度,如果你知道我的意思,我想添加一个名为SEPARATOR的选项。我无法在互联网上找到任何答案,我只是一个xsl转换的初学者,所以我正在寻找一个快速解决方案。先谢谢你。

+0

你能否包括一些简化的样本输入和期望的输出?就目前来看,你的问题还不够清楚。 – 2012-04-26 05:11:08

+0

一般观点:不要使用'。改用''。它不仅更简洁,而且更高效。 – 2012-04-26 08:19:18

+0

嗯..如果它有助于输入(变量“文本”)将形成一个文本文件'Blah等等等等,等等等等'和期望的输出像'等等等等等等 ''''等等......和迈克尔,我试着用你的建议,但是如果你向左滚动,有一个'disable-output-escaping =“yes”'属性,它给出我错误的时候,我把它放到'xsl:variable'标签 – 2012-04-26 11:23:13

回答

3

tokenize()函数不允许您发现分隔符是什么。如果您需要知道,则需要使用xsl:analyze-string。如果您使用与tokenize()相同的正则表达式,则会将“令牌”传递给xsl:non-matching-substring指令,将“分隔符”传递给xsl:matching-substring指令。

+0

非常感谢你,在几个小时后,试图弄清楚'xsl:analyze-string'是如何工作的,我得到了我想要的东西。 – 2012-04-26 12:48:27