2010-05-31 72 views
1

如何使用XSLT查找單詞節點之前和之後的單詞?XSLT找到另一個單詞附近的單詞

+0

很好的問題(+1)。查看我的答案以獲取完整的XSLT 1.0和XSLT 2.x解決方案。 :) – 2010-05-31 17:04:36

回答

0

I.在XSLT 2.X/XPath的2.x的一個可以使用的功能和tokenize()index-of()以產生具有單行XPath表達式所期望的結果:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:param name="pWord" select="'three'"/> 

<xsl:template match="text()"> 
    <xsl:sequence select= 
    "tokenize(., ',\s*') 
     [index-of(tokenize(current(), ',\s*'), $pWord) -1]"/> 

    <xsl:sequence select= 
    "tokenize(., ',\s*') 
     [index-of(tokenize(current(), ',\s*'), $pWord) +1]"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種轉化是施加在下面的XML文檔

<t>One, two, three, four</t> 

有用,正確的結果產生

two four 

II。 XSLT 1.0解決方案

有可能使用的FXSLstrSplit-to-Words模板解決XSLT 1.0相同的任務。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
> 
    <xsl:import href="strSplit-to-Words.xsl"/> 

    <xsl:output method="text"/> 

    <xsl:param name="pWord" select="'three'"/> 

    <xsl:template match="/"> 
     <xsl:variable name="vrtfwordNodes"> 
     <xsl:call-template name="str-split-to-words"> 
      <xsl:with-param name="pStr" select="/"/> 
      <xsl:with-param name="pDelimiters" 
          select="', &#9;&#10;&#13;'"/> 
     </xsl:call-template> 
     </xsl:variable> 

     <xsl:variable name="vwordNodes" 
     select="ext:node-set($vrtfwordNodes)/*"/> 

     <xsl:variable name="vserchWordPos" select= 
     "count($vwordNodes 
       [. = $pWord]/preceding-sibling::* 
      ) +1"/> 

     <xsl:value-of select= 
     "concat($vwordNodes[$vserchWordPos -1], 
       ' ', 
       $vwordNodes[$vserchWordPos +1] 
       ) 
     "/> 
    </xsl:template> 
</xsl:stylesheet> 

當這種轉變是在同一個XML文檔應用:

<t>One, two, three, four</t> 

想要的,正確的結果產生

two four 
相關問題