1

有没有办法在 XSL 1.0 中执行分析字符串操作例如在 XSL 2.0 中我们可以:

  <xsl:analyze-string select="Description" regex="$param1">
    <xsl:matching-substring>
    <span style="background-color: papayawhip;">
<xsl:value-of select="."/></span>
    </xsl:matching-substring>
    <xsl:non-matching-substring>
    <xsl:value-of select="."/>
    </xsl:non-matching-substring>
    </xsl:analyze-string>

因此,这将在 Description 节点中查找 param1 并将其替换为<span>. 用 XSL 1.0 可以做这样的事情吗?

4

2 回答 2

3

使用类似的东西:

<xsl:if test="contains(x, $param)">
  <xsl:value-of select="substring-before(x, $param)"/>
  <span><xsl:value-of select="$param"/></span>
  <xsl:value-of select="substring-after(x, $param)"/>
</xsl:if>
于 2012-10-09T19:01:24.893 回答
1

如果您只是想在Description元素中查找子字符串,那么使用 XSLT 1.0 可以通过编写一个命名的递归模板来实现:

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

<xsl:param name="param1" select="'foo'"/>

<xsl:template name="wrap">
  <xsl:param name="input"/>
  <xsl:param name="search"/>
  <xsl:param name="wrapper-element" select="'span'"/>
  <xsl:param name="wrapper-style" select="'background-color: papayawhip;'"/>
  <xsl:choose>
     <xsl:when test="not(contains($input, $search))">
       <xsl:value-of select="$input"/>
     </xsl:when>
     <xsl:otherwise>
       <xsl:value-of select="substring-before($input, $search)"/>
       <xsl:element name="{$wrapper-element}">
         <xsl:if test="$wrapper-style">
           <xsl:attribute name="style">
             <xsl:value-of select="$wrapper-style"/>
           </xsl:attribute>
         </xsl:if>
         <xsl:value-of select="$search"/>
       </xsl:element>
       <xsl:call-template name="wrap">
         <xsl:with-param name="input" select="substring-after($input, $search)"/>
         <xsl:with-param name="search" select="$search"/>
         <xsl:with-param name="wrapper-element" select="$wrapper-element"/>
         <xsl:with-param name="wrapper-style" select="$wrapper-style"/>
       </xsl:call-template>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>

<xsl:template match="Description">
  <div>
    <xsl:call-template name="wrap">
      <xsl:with-param name="input" select="."/>
      <xsl:with-param name="search" select="$param1"/>
    </xsl:call-template>
  </div>
</xsl:template>

</xsl:stylesheet>

这样的代码然后转换

<Root>
  <Description>foo bar baz foobar test whatever foo</Description>
</Root>

进入

  <div><span style="background-color: papayawhip;">foo</span> bar baz <span style="background-color: papayawhip;">foo</span>bar test whatever <span style="background-color: papayawhip;">foo</span></div>

以此为例,您可以以某种方式适应您的需求,它当然不意味着完全替代 XSLT 2.0 的分析字符串。

于 2012-10-10T10:48:35.910 回答