如何在XSLT中提取部分内容

时间:2012-03-16 17:30:33

标签: xml xslt xslt-1.0

我想提取元素的部分值,并将其作为属性赋予它。

源:

 <www>
      <sss>
             <eee>XML ELEMENT VALUE 
             [part].HTML element value [HTPART]. 
               HTML element value [HTPART2].
             </eee>
     </sss>
 </www>

它继续这样。方括号[]的内容可能会多次出现。并且源中有许多额外的空间。我想删除多余的空格并显示这样的内容。

输出要求:

      <fff>XML ELEMENT VALUE<ggg name="part"/>.HTML element value<ggg name="HTPART"/>.HTML element value<ggg   name="HTPART2"/>. </fff>

任何人都可以建议如何做到这一点。我是XSLT的新手。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

字符串处理不是XSLT的强项 - 毕竟它是一种XML处理语言,而不是通用语言。

你的问题可以通过递归来解决:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

  <xsl:template match="eee">
    <fff>
      <xsl:call-template name="process">
        <xsl:with-param name="text" select="text()" />
      </xsl:call-template>
    </fff>
  </xsl:template>

  <xsl:template name="process">
    <xsl:param name="text" select="''" />

    <xsl:variable name="head" select="substring-before($text, '[')" />
    <xsl:variable name="tag"  select="substring-before(substring-after($text, '['), ']')" />
    <xsl:variable name="tail" select="substring-after($text, ']')" />

    <xsl:choose>
      <xsl:when test="$head != '' and $tag != ''">
        <xsl:value-of select="$head" />
        <ggg name="{$tag}" />
        <!-- recursive step: process the remainder of the string -->
        <xsl:call-template name="process">
          <xsl:with-param name="text" select="$tail" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

以上模板输出,供您输入:

 <fff>XML ELEMENT VALUE 
 <ggg name="part"/>.HTML element value <ggg name="HTPART"/>. 
   HTML element value <ggg name="HTPART2"/>.
 </fff>