Разделители токенов XSLT 2.0 внутри разделителей - PullRequest
0 голосов
/ 25 октября 2018

В XSLT 2.0 у меня есть длинная строка (параметр) с разделителем (;) внутри разделителя (~), более конкретно, триплет внутри разделителя.

Данные организованы так:

<parameter>qrsbfs;qsvsv;tfgz~dknk;fvtea;gtvath~pksdi;ytbdi;oiunhu</parameter>

Первый tokenize($mystring,'~') в for-each производит:

qrsbfs;qsvsv;tfgz
dknk;fvtea;gtvath
pksdi;ytbdi;oiunhu

В этом токенизации мне нужно обработать его, повторив цикл:

qrsbfs
qsvsv
tfgz

dknk
fvtea
gtvath

pksdi
ytbdi
oiunhu

Я могу выполнять интенсивные манипуляции со строками, чтобы добраться туда, используя concat, string-length и substring-before / substring-after, но мне было интересно, не было ли более изящного решения, чем мой разум неофита?пропускает?

РЕДАКТИРОВАТЬ, добавляя вложенный токен, который дал неверные результаты:

        <xsl:for-each select="tokenize($myparameter,'~')">
            <xsl:for-each select="tokenize(.,';')">
                <xsl:if test="position()=1">
                    <xsl:value-of select="."/>
                </xsl:if>
                <xsl:if test="position()=2">
                    <xsl:value-of select="."/>
                </xsl:if>
                <xsl:if test="position()=3">
                    <xsl:value-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Для чего бы то ни было, код в https://xsltfiddle.liberty -development.net / pPqsHUe использует

  <xsl:template match="parameter">
      <xsl:for-each select="tokenize(., '~')">
          <xsl:value-of select="tokenize(., ';')" separator="&#10;"/>
          <xsl:text>&#10;&#10;</xsl:text>
      </xsl:for-each>
  </xsl:template>

и с методом вывода text производит

qrsbfs
qsvsv
tfgz

dknk
fvtea
gtvath

pksdi
ytbdi
oiunhu
0 голосов
/ 27 октября 2018

Если вам нужно однострочное решение, вы можете сделать что-то вроде этого, используя вложенные операторы for-in-return:

 <xsl:sequence select="for $n in tokenize(.,'~') return concat(string-join(tokenize($n,';'),'&#xa;'),'&#xa;&#xa;')"/>
0 голосов
/ 25 октября 2018

Если вам не нужно токенизировать их отдельно, вы можете заменить ~ на ; и токенизировать все 9 элементов одновременно:

tokenize(replace(parameter,'~',';'),';')

...