我正在使用XSLT 1.0。我有以下xml输入:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<groupLOB>M1 M2 M3 M4</groupLOB>
</root>
标签<groupLOB>
的值为M1 M2 M3 M4
现在,我想将值拆分为多个字符串,并根据定界符'space'将它们无限个存储。 ''。我的最终xml应该如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<One>M1</One>
<Two>M2</Two>
<Three>M3</Three>
<Four>M4</Four>
</root>
我尝试了以下XSLT,但未提供所需的输出,即我不确定如何在新标签下移动拆分值。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" />
<xsl:template match="/*">
<xsl:value-of select="translate(., ' ', '
')" />
</xsl:template>
</xsl:stylesheet>
有人对此有任何想法吗?
答案 0 :(得分:1)
XSLT 2.0解决方案可能是:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each select="tokenize(groupLOB,' ')">
<xsl:variable name="elementName">
<xsl:number value="position()" format="Ww"/>
</xsl:variable>
<xsl:element name="{$elementName}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在XSLT 3.0中
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each select="tokenize(groupLOB,' ')">
<xsl:element name="{format-integer(position(),'Ww')}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
两个输出
<root>
<One>M1</One>
<Two>M2</Two>
<Three>M3</Three>
<Four>M4</Four>
</root>
然后在XSLT 1.0中,您将需要通过扩展功能(如EXSLT tokenize()或递归模板(如Jeni Tennison的XSLT implementation of EXSLT tokenize)来标记化。最大的任务是从数字到单词的转换。幸运的是,我们可以看到Saxon的开源程序将Java实现转换为XSLT实现。这可能会花费一些时间,但是很简单。
通过https://dev.saxonica.com/repos/archive/opensource/trunk/bj/net/sf/saxon/number/Numberer_en.java
检查Saxon随附的英语实现。