分隔符中的XSLT 2.0标记化分隔符

时间:2018-10-25 19:06:58

标签: xslt xslt-2.0

在XSLT 2.0中,我有一个长字符串(参数),在定界符(〜)内有定界符(;),更具体地说是在定界符内有一个三元组。

数据的组织方式如下:

<parameter>qrsbfs;qsvsv;tfgz~dknk;fvtea;gtvath~pksdi;ytbdi;oiunhu</parameter>

tokenize($mystring,'~')中的第一个for-each产生:

qrsbfs;qsvsv;tfgz
dknk;fvtea;gtvath
pksdi;ytbdi;oiunhu

在该标记化过程中,我需要再次循环处理它:

qrsbfs
qsvsv
tfgz

dknk
fvtea
gtvath

pksdi
ytbdi
oiunhu

我可以使用concatstring-lengthsubstring-before / substring-after进行密集的字符串操作,但是我想知道是否没有更优雅的解决方案我的新手头脑没有被忽略?

编辑,添加返回错误结果的嵌套标记化:

        <xsl:for-each select="tokenize($myparameter,'~')">
            <xsl:for-each select="tokenize(.,';')">
                <xsl:if test="position()=1">
                    <xsl:value-of select="."/>
                </xsl:if>
                <xsl:if test="position()=2">
                    <xsl:value-of select="."/>
                </xsl:if>
                <xsl:if test="position()=3">
                    <xsl:value-of select="."/>
                </xsl:if>
            </xsl:for-each>
        </xsl:for-each>

3 个答案:

答案 0 :(得分:1)

如果您想要一个单行解决方案,则可以使用嵌套的for-in-return语句执行以下操作:

 <xsl:sequence select="for $n in tokenize(.,'~') return concat(string-join(tokenize($n,';'),'&#xa;'),'&#xa;&#xa;')"/>

答案 1 :(得分:0)

如果不需要分别标记它们,则可以将~替换为;并同时标记所有9个元素:

tokenize(replace(parameter,'~',';'),';')

答案 2 :(得分:0)

对于价值而言,https://xsltfiddle.liberty-development.net/pPqsHUe中的代码使用

  <xsl:template match="parameter">
      <xsl:for-each select="tokenize(., '~')">
          <xsl:value-of select="tokenize(., ';')" separator="&#10;"/>
          <xsl:text>&#10;&#10;</xsl:text>
      </xsl:for-each>
  </xsl:template>

并使用输出方法text产生

qrsbfs
qsvsv
tfgz

dknk
fvtea
gtvath

pksdi
ytbdi
oiunhu