XSL:随机订单字符串到固定订单表

时间:2014-12-12 13:59:45

标签: xslt xslt-1.0

我有一个像这样的随机字符串:        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>

是什么创建了这样的表

Table Output

字符串有时会提供更多信息。 例子是:

  • 没有信息
  • 所有13种可能的结果
  • 介于两者之间的任何事情

要点: 输入字符串中的顺序可以是随机的,但输出表必须与提供的表中的顺序相同。

列出的表有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>

注意:上面的代码是我使用的简化版本。

任何有关如何以不同方式解决此问题的建议都将得到所需的结果。

1 个答案:

答案 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>