获取特定单词的位置

问题描述:

我是XSLT中的新成员,是否可以获取特定单词的位置?例如,我有这样一个数据:获取特定单词的位置

<Data>The quick brown fox jumps over the lazy dog!</Data> 

我希望得到一个“棕色”,“上”,“狗”的位置和“!”。并且,以不同的输出名称存储它。像棕色的位置<foo>3</foo>,在的位置<boo>6</boo><hop>9</hop><po_df>10</po_df>。可能吗?

+1

欢迎来到SO,@ user918368。你已经标记了xslt-1.0和-2.0,那么你到底在使用什么? iff 2.0那么你可以删除1.0标签 –

+0

是的,我使用v2.0。谢谢 – user7918368

如果你只想找的话,你可以使用tokenize(., '\s+|\p{P}')

<xsl:template match="Data"> 
    <xsl:copy> 
     <xsl:variable name="words" select="tokenize(., '\s+|\p{P}')"/> 
     <xsl:for-each select="'brown', 'over', 'dog'"> 
      <matched item="{.}" at-pos="{index-of($words, .)}"/> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

这给

<Data> 
    <matched item="brown" at-pos="3"/> 
    <matched item="over" at-pos="6"/> 
    <matched item="dog" at-pos="9"/> 
</Data> 

所以它有正确的位置(我不知道在哪里的元素的名称您发布(如hop)将被取消,所以我没有试图实现这一点)。

由于您还想识别标点符号,因此我不确定标记化足够了,即使使用分析字符串,也不是直接匹配并收集位置。也许别人有更好的主意。

+0

要添加到此答案,一些正则表达式方言可以选择分割“单词边界”,但这是从一种语言到另一种语言高度变化的一种选择,所以它不存在于XPath中,它旨在成为国际化语言。如果您可以对“单词”的含义提出明确的定义,那么我们可以帮助您在代码中实现该定义。 –

+0

好标记表达式。 –