XSLT манипулирует строкой, перемещает последнее слово - PullRequest
0 голосов
/ 14 октября 2019

Я хотел бы спросить, можно ли поменять последнее слово на предыдущее, если оно заканчивается 27,5 или 29:

<item>
         <code>1</code>
         <title><![CDATA[Test 30 S 27.5]]></title>
</item>
<item>
         <code>2</code>
         <title><![CDATA[Test 20 Orange XL 29]]></title>
</item>
<item>
         <code>3</code>
         <title><![CDATA[Test 30 XS 29]]></title>
</item>
<item>
         <code>4</code>
         <title><![CDATA[Test 60 27.5 XS]]></title>
</item>

Пример вывода:

<item>
         <code>1</code>
         <title><![CDATA[Test 30 27.5 S]]></title>
</item>
<item>
         <code>2</code>
         <title><![CDATA[Test 20 Orange 29 XL]]></title>
</item>
<item>
         <code>3</code>
         <title><![CDATA[Test 30 29 XS]]></title>
</item>
<item>
         <code>4</code>
         <title><![CDATA[Test 60 27.5 XS]]></title>
</item>

1 Ответ

1 голос
/ 14 октября 2019

Используйте tokenize или analyze-string, а затем измените порядок последовательности, полученной из tokenize, или обработайте результат analyze-string:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output cdata-section-elements="title"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="title[ends-with(., '27.5') or ends-with(., '29')]">
      <xsl:copy>
          <xsl:value-of select="let $words := tokenize(., '\s+') 
               return (subsequence($words, 1, count($words) - 2), $words[last()], $words[last() - 1])"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net/ 3NSSEuS / 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...