XSLT найти слово рядом с другим словом - PullRequest
1 голос
/ 31 мая 2010

Как найти в XSLT слово до и после другого известного слова в текстовом узле?

1 Ответ

0 голосов
/ 31 мая 2010

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 решение

Эту же задачу можно решить в XSLT 1.0 с помощью шаблона strSplit-to-Words FXSL .

<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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...