首页 > 解决方案 > 使用 XSLT 将标签元素拆分为不同名称的标签

问题描述

我有一个<Content>标签,其中有一个字符串,例如:

"Hello how do you do END"

我正在尝试做的是将该字符串拆分为 "\t" 并将每个单词放入一个不同的命名标签中,如下所示:

<a>Hello</a>
<b>how</b>
<c>do</c>

我使用 tokenize 拆分它们:

<xsl:template match="*:Content/text()">
   <xsl:for-each select="tokenize(.,'\t')">
    <b xmlns="">
     <xsl:sequence select="."/>
    </b>
   </xsl:for-each>
</xsl:template>

我只需要以后能够在不知道它们的情况下区分这些词。有人能帮我吗?

标签: xmlxsltsplittags

解决方案


您可以position()使用正确的格式格式化,例如

  <xsl:template match="test">
      <xsl:copy>
          <xsl:for-each select="tokenize(., '\s+')">
              <xsl:element name="{format-integer(position(), 'a')}">
                  <xsl:value-of select="."/>
              </xsl:element>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty-development.net/nc4NzRm

对于 XSLT 2,您可以xsl:number用来格式化position()

 <xsl:template match="test">
      <xsl:copy>
          <xsl:for-each select="tokenize(., '\s+')">
              <xsl:variable name="element-name">
                  <xsl:number format="a" value="position()"/>
              </xsl:variable>
              <xsl:element name="{$element-name}">
                  <xsl:value-of select="."/>
              </xsl:element>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template> 

http://xsltransform.hikmatu.com/pPqsHSV

但是,简单地创建一个具有属性中位置的同名元素可能更有意义:

  <xsl:template match="test">
      <xsl:copy>
          <xsl:for-each select="tokenize(., '\s+')">
              <word pos="{position()}">
                  <xsl:value-of select="."/>
              </word>
          </xsl:for-each>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty-development.net/nc4NzRm/1


推荐阅读