【问题标题】:XSLT tokenize - capturing the separatorsXSLT 标记化 - 捕获分隔符
【发布时间】: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+(&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>

当您看到构建的标签 CONTENTS、LENGTH 时,如果您明白我的意思,我想添加一个名为 SEPARATOR 的标签。我在互联网上找不到任何答案,而且我只是 xsl 转换的初学者,所以我正在寻找一个快速的解决方案。提前谢谢你。

【问题讨论】:

  • 您能否包含一些简化的示例输入和预期输出?就目前而言,您的问题还不够清楚。
  • 一般要点:不要使用&lt;xsl:variable name="x"&gt;&lt;xsl:value-of select="s"/&gt;&lt;/xsl:variable&gt;。而是使用&lt;xsl:variable name="x" select="s"/&gt;。它不仅不那么冗长,而且效率更高。
  • Hmm.. 如果它有助于输入(变量“文本”)将是 Blah blah blah, blah blah (blah blah) blah. 形式的文本文件和所需的输出类似于 &lt;TEXT&gt;&lt;FRAGMENT&gt;&lt;CONTENT&gt;Blah blah blah&lt;/CONTENT&gt;&lt;LENGTH&gt;14&lt;/LENGTH&gt;&lt;SEPARATOR&gt;,&lt;/SEPARATOR&gt;&lt;/FRAGMENT&gt;... 等等......和迈克尔,我尝试使用您的建议,但是如果您向左滚动,则有一个 disable-output-escaping="yes" 属性,当我将其放入 xsl:variable 标记时,它会给我一个错误

标签: xslt tokenize separator


【解决方案1】:

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

【讨论】:

  • 非常感谢,经过几个小时试图弄清楚 xsl:analyze-string 的工作原理后,我得到了我想要的。
猜你喜欢
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多