根据定界符分割字符串,并使用XSLT将其移动到新节点下

时间:2019-04-26 09:44:48

标签: xslt

我正在使用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(., ' ', '&#xA;')" />
   </xsl:template>
</xsl:stylesheet>

有人对此有任何想法吗?

1 个答案:

答案 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随附的英语实现。
相关问题