Парсинг строки через запятую XSLT - PullRequest
9 голосов
/ 17 мая 2010

Как я могу пройти через строку через запятую, которую я передаю в качестве параметра в XSLT 1.0? Ex-

<xsl:param name="UID">1,4,7,9</xsl:param>

Мне нужно зациклить вышеуказанный параметр UID и собрать узлы из каждого UID в моем XML-файле

Ответы [ 2 ]

20 голосов
/ 17 мая 2010

Vanilla XSLT 1.0 может решить эту проблему путем рекурсии.

<xsl:template name="split">
  <xsl:param name="list"      select="''" />
  <xsl:param name="separator" select="','" />

  <xsl:if test="not($list = '' or $separator = '')">
    <xsl:variable name="head" select="substring-before(concat($list, $separator), $separator)" />
    <xsl:variable name="tail" select="substring-after($list, $separator)" />

    <!-- insert payload function here -->

    <xsl:call-template name="split">
      <xsl:with-param name="list"      select="$tail" />
      <xsl:with-param name="separator" select="$separator" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>

Существуют предварительно созданные библиотеки расширений, которые могут выполнять токенизацию строк (например, EXSLT имеет шаблон для этого), но я сомневаюсь, что это действительно необходимо.

4 голосов
/ 17 мая 2010

Вот решение XSLT 1.0 с использованием шаблона str-split-to-words FXSL .

Обратите внимание, что этот шаблон позволяет разделить на несколько разделителей (передается в виде отдельной строки параметров), поэтому даже 1,4 7;9 будет разделен без проблем при использовании этого решения.

<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 indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
      <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:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу XML :

<x>1,4,7,9</x>

желаемый, правильный результат получается :

<word>1</word>
<word>4</word>
<word>7</word>
<word>9</word>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...