首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xsl和tokenize with a word

xsl和tokenize with a word
EN

Stack Overflow用户
提问于 2018-11-18 20:34:45
回答 2查看 292关注 0票数 0

我想用一个单词来标记字符串。我使用的是str:tokenize(),但是分隔符可能只有一个字符,即使分隔符由更多的字符组成,tokenize()也会搜索分隔符中列出的字符。

例如。

代码语言:javascript
复制
InputString : "first|second|third|@@|First|Second|Third  
Delimiter : |@@|  
str:tokenize(&InputString, '|@@|') 

但是这会返回6行而不是2行

我需要在for-each中使用标记化的“句子”进行下一步操作。

str:tokenize()做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-11-18 21:45:09

您得到的结果符合str:tokenize函数的规范:

第二个参数是一个由多个字符组成的字符串。此字符串中的每个字符都被视为分隔字符。第一个参数给出的字符串在这些字符中的任何一个出现时被拆分。

您要做的是在给定的模式出现的任何地方拆分给定的字符串。为此,您需要使用str:split函数-如果您的处理器支持它的话。

票数 0
EN

Stack Overflow用户

发布于 2018-11-19 06:19:26

感谢您的建议。

我附上了符合我需要的示例代码-可能会帮助某人节省时间。它获取元素并根据两个分隔符对其进行解析,再加上绘制所有单元格(包括空单元格-甚至最后一个单元格也是空的)。如果第二个单元格/列为空,它将跳过整行。

XML:

代码语言:javascript
复制
    <?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:

代码语言:javascript
复制
<?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>

screenshot of Output vs XML

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53360930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档