xslt - xsl 并用一个词进行标记
问题描述
我想用一个词来标记字符串。我正在使用 str:tokenize() 但似乎分隔符可能只是单个字符,即使分隔符包含更多字符,tokenize() 也会搜索分隔符中列出的字符。
例如
InputString : "first|second|third|@@|First|Second|Third
Delimiter : |@@|
str:tokenize(&InputString, '|@@|')
但这会返回 6 行而不是 2
由于带有标记化“句子”的下一个操作,我需要将它放在 for-each 中
我在 str:tokenize() 做错了什么?
解决方案
thx 的建议。
我附上了符合我需要的示例代码-可能会帮助某人节省他/她的时间。它根据两个分隔符获取元素并解析它,再加上它绘制所有单元格(包括空单元格 - 甚至最后一个单元格也是空的)。如果第二个单元格/列为空,它将跳过整行。
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>
推荐阅读
- powershell - 使用PowerShell刷新Firefox上的网页
- laravel - Vue 路由不起作用。Laravel 8 + Vue
- ionic-framework - 离子内容内按钮的离子问题
- javascript - 如何结合 Marked 和 MathJax
- html - HTML 中的图像未显示 ERR_FILE_NOT_FOUND 错误
- ruby-on-rails - 嵌套表单不保存,因为父级不存在
- r - r - 使用带有条件的 fill()
- mysql - 查询以将不存在的行包含为 0 值
- elixir - 如何使用“|” 将多个列表附加到现有列表?
- elasticsearch - 使用decode_json_fields时的elasticsearch filebeat mapper_parsing_exception