XSL и токенизировать со словом - PullRequest
0 голосов
/ 18 ноября 2018

Я бы хотел токенизировать строку со словом. Я использую str: tokenize (), но кажется, что разделителем может быть только один символ, даже если разделитель состоит из большего количества символов, tokenize () выполняет поиск перечисленных символов в разделителе.

например.

InputString : "first|second|third|@@|First|Second|Third  
Delimiter : |@@|  
str:tokenize(&InputString, '|@@|') 

но это возвращает 6 строк вместо 2

Мне нужно иметь его для каждого из-за следующих операций с токенизированными "предложениями"

Что я делаю не так с str: tokenize ()?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

спасибо за совет.

Я прилагаю пример кода, который соответствует моим потребностям - может быть, это поможет кому-то сэкономить свое время.Он берет элемент и анализирует его по двум разделителям, плюс он рисует все ячейки (включая пустую - даже последняя пуста).Если вторая ячейка / столбец пуста, будет пропущена вся строка.

XML:

    <?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <cd>
        <title>firs t|sec ond|third|@@|First|Second|Third</title>
        <artist>Bob Dylan</artist>
    </cd>
    <cd>
        <title>1||3|@@|4|5|6|@@|7|8|</title>
        <artist>Bob Dylan</artist>
    </cd>
    <cdd>
        <title>1|2|@@|3|4|@@||</title>
        <artist>Bob Dylan</artist>
    </cdd>
</catalog>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:str="http://exslt.org/strings"
    xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="str exsl">
    <!-- Edit these parameters if necessary. -->
    <xsl:param name="rowDelimiter" select="'|@@|'"/>
    <xsl:param name="columnDelimiter" select="'|'"/>
    <!-- Edit these parameters if necessary. -->

    <xsl:template match="/">
        <html> 
            <body>
                <h2>My test</h2>
                <table border="1">
                    <tr bgcolor="#9acd32">
                        <th style="text-align:left">Title</th>
                    </tr>

                    <xsl:for-each select="catalog/cd">
                        <xsl:variable name="ercm_rows">
                            <xsl:call-template name="splitStringToRows">
                                <xsl:with-param name="list" select="title" />
                                <xsl:with-param name="delimiter" select="$rowDelimiter"/>
                            </xsl:call-template>
                        </xsl:variable>


                        <xsl:for-each select="exsl:node-set($ercm_rows)/ercm_row">
                                  <xsl:if test="./ercm_column[position()=2 != ''] and ./ercm_column[position()=2]/text()"> 
                            <tr>
                                <xsl:for-each select="./ercm_column">
                                    <td><xsl:value-of select="."/></td>
                                </xsl:for-each>
                            </tr>
                            </xsl:if> 
                        </xsl:for-each>

                    </xsl:for-each>
                </table>


            </body>
        </html>
    </xsl:template>

   <!--  ROWS SPLIT --> 
    <xsl:template name="splitStringToRows">
        <xsl:param name="list" />
        <xsl:param name="delimiter" />


        <xsl:variable name="newlist">
            <xsl:choose>
                <xsl:when test="contains($list, $delimiter)">
                    <xsl:value-of select="$list" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat($list, $delimiter)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="first" select="substring-before($newlist, $delimiter)" />
        <xsl:variable name="remaining" select="substring-after($newlist, $delimiter)" />
        <ercm_row>
            <xsl:call-template name="splitStringToColumns">
                    <xsl:with-param name="list" select="$first" />
                    <xsl:with-param name="delimiter" select="$columnDelimiter"/>
                </xsl:call-template>
        </ercm_row>


        <xsl:if test="$remaining">
            <xsl:call-template name="splitStringToRows">
                <xsl:with-param name="list" select="$remaining" />
                <xsl:with-param name="delimiter" select="$rowDelimiter"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>

    <!--  COLUMNS SPLIT -->
    <xsl:template name="splitStringToColumns">
        <xsl:param name="list" />
        <xsl:param name="delimiter" />

        <xsl:variable name="newlist">
            <xsl:choose>
                <xsl:when test="contains($list, $delimiter)">
                    <xsl:value-of select="$list" />
                </xsl:when>
                <xsl:otherwise>
                    <xsl:value-of select="concat($list, $delimiter)"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:variable>

        <xsl:variable name="first" select="substring-before($newlist, $delimiter)" />
        <xsl:variable name="remaining" select="substring-after($newlist, $delimiter)" />
        <ercm_column>
              <xsl:value-of select="$first"/>
        </ercm_column>

        <!--    <xsl:if test="$remaining" > -->
        <xsl:if test="contains($list, $delimiter)" >
            <xsl:call-template name="splitStringToColumns">
                <xsl:with-param name="list" select="$remaining" />
                <xsl:with-param name="delimiter" select="$columnDelimiter"/>
            </xsl:call-template>
        </xsl:if>
    </xsl:template>



</xsl:stylesheet>

снимок экрана «Вывод против XML»

0 голосов
/ 18 ноября 2018

Полученный результат соответствует спецификации для функции str:tokenize:

Второй аргумент - это строка, состоящая из нескольких символов.Каждый символ в этой строке считается символом-разделителем.Строка, заданная первым аргументом, разделяется при любом появлении любого из этих символов.


То, что вы хотите сделать, это разбивать данную строку при любом появлении данного шаблона вместо.Для этого вам нужно использовать функцию str:split - если ваш процессор ее поддерживает.

...