在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
我可以使用concat
,string-length
和substring-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>
答案 0 :(得分:1)
如果您想要一个单行解决方案,则可以使用嵌套的for-in-return语句执行以下操作:
<xsl:sequence select="for $n in tokenize(.,'~') return concat(string-join(tokenize($n,';'),'
'),'

')"/>
答案 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=" "/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
并使用输出方法text
产生
qrsbfs
qsvsv
tfgz
dknk
fvtea
gtvath
pksdi
ytbdi
oiunhu