我有一个像这样的随机字符串: 2 | TSB; 1 |的NoA; 17 | IPR; 3 | RNA; 1 | NVM; 6 | OTH; 13 | UEE
输出需要进入如下表格:
<html xmlns:exsl="http://exslt.org/common">
<head>
</head>
<body>
<table border="1">
<tr>
<td>2</td>
<td>-</td>
<td>TSB</td>
<td></td>
<td></td>
<td>-</td>
<td>OSA</td>
<td></td>
<td>17</td>
<td>-</td>
<td>IP</td>
<td></td>
<td>1</td>
<td>-</td>
<td>NoAgent</td>
<td colspan="4"></td>
</tr>
<tr>
<td></td>
<td>-</td>
<td>LO</td>
<td></td>
<td>13</td>
<td>-</td>
<td>UEE</td>
<td></td>
<td></td>
<td>-</td>
<td>MES</td>
<td></td>
<td>1</td>
<td>-</td>
<td>NoVM</td>
<td colspan="4"></td>
</tr>
<tr>
<td></td>
<td>-</td>
<td>SIT</td>
<td></td>
<td>3</td>
<td>-</td>
<td>RNA</td>
<td></td>
<td></td>
<td>-</td>
<td>NSR</td>
<td></td>
<td></td>
<td>-</td>
<td>ITF</td>
<td>6</td>
<td>-</td>
<td>OTH</td>
</tr>
</table>
</body>
</html>
是什么创建了这样的表
字符串有时会提供更多信息。 例子是:
要点: 输入字符串中的顺序可以是随机的,但输出表必须与提供的表中的顺序相同。
列出的表有3行,每个3个单元格的4列用空单元格分隔,但我可能想将其更改为4行,每3个单元格的3列用空单元格分隔。
输出是从模板内部创建的。 xsl使用apply并调用多个模板来创建此表所属的输出。
数据包含在外部文件中,如下所示:
<xsl:apply-templates select="document('file://LocalHost/DATA/DialStatsExamp.xml')" mode="my-mode">
<xsl:with-param name="WGroup" select="$WG" />
<xsl:with-param name="CSII" select="$CurrentShiftInboundInteractions" />
</xsl:apply-templates>
我很难将连接的字符串提取到表中,所有尝试的结果都是以如下逻辑提取参数的随机顺序:
<xsl:template name="divideSemiColonVariables">
<xsl:param name="to-be-divided"/>
<xsl:param name="delimiter"/>
<xsl:choose>
<xsl:when test="contains($to-be-divided,$delimiter)">
<xsl:value-of select="substring-before($to-be-divided,$delimiter)"/>
<xsl:text>,</xsl:text>
<xsl:call-template name="divideSemiColonVariables">
<xsl:with-param name="to-be-divided" select="substring-after($to-be-divided,$delimiter)"/>
<xsl:with-param name="delimiter" select="','"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$to-be-divided"/>
</xsl:otherwise>
</xsl:choose>
注意:上面的代码是我使用的简化版本。
任何有关如何以不同方式解决此问题的建议都将得到所需的结果。
答案 0 :(得分:1)
我无法理解如何引用输入字符串。在以下示例中,它被称为“yourstring”。
这里的想法是将输入字符串标记为可以按名称调用的节点。标记化模板创建一个如下所示的节点集:
<token name="TSB">2</token>
<token name="NoA">1</token>
<token name="IPR">17</token>
<token name="RNA">3</token>
<token name="NVM">1</token>
<token name="OTH">6</token>
<token name="UEE">13</token>
有了这个,你可以在你需要的地方准确地调用所需的数据,只需:
xsl:value-of select="$data-set[@name='xyz']"/>
以下是表格第一行的示例:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:variable name="data">
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="yourstring"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="data-set" select="exsl:node-set($data)/token" />
<xsl:template match="/">
<table border="1">
<tr>
<td><xsl:value-of select="$data-set[@name='TSB']"/></td>
<td>-</td>
<td>TSB</td>
<td></td>
<td></td>
<td>-</td>
<td>OSA</td>
<td></td>
<td><xsl:value-of select="$data-set[@name='IPR']"/></td>
<td>-</td>
<td>IP</td>
<td></td>
<td><xsl:value-of select="$data-set[@name='NoA']"/></td>
<td>-</td>
<td>NoAgent</td>
<td colspan="4"></td>
</tr>
<!-- etc. -->
</table>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="string"/>
<xsl:param name="delimiter" select="';'"/>
<xsl:choose>
<xsl:when test="contains($string, $delimiter)">
<xsl:variable name="token" select="substring-before($string, $delimiter)" />
<token name="{substring-after($token, '|')}">
<xsl:value-of select="substring-before($token, '|')"/>
</token>
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="string" select="substring-after($string, $delimiter)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<token name="{substring-after($string, '|')}">
<xsl:value-of select="substring-before($string, '|')"/>
</token>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>