【问题标题】:how to extract part of content in XSLT如何在 XSLT 中提取部分内容
【发布时间】:2025-12-30 01:05:11
【问题描述】:

我想提取元素的部分值并将其作为属性分配给它。

来源:

 <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 的新手。

提前谢谢你。

【问题讨论】:

  • XSLT 是您唯一可以使用的工具吗?因为这在 XSLT 之外会简单得多。
  • 是的.. 我只使用 XSLT,我的任务将只支持 XSLT

标签: xml xslt xslt-1.0


【解决方案1】:

字符串处理不是 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>

【讨论】: