1

我有像下面这样由 XSLT 解析的字符串

boy "happy family" filetype:pdf girl 

从上面的字符串中,我只需要过滤掉“boy”和“girl”这两个单词,然后得到另一个字符串

boy girl

我该如何实现这一目标?

4

3 回答 3

1

使用 XSLT 2.0,您可以replace使用正则表达式的函数,所以这样做replace('boy "happy family" filetype:pdf girl', '"[^"]*"|\w+:\w+', '')应该可以工作。对于 XSLT 1.0,我首先会检查您的 XSLT 1.0 处理器是否支持类似的扩展功能

于 2012-04-13T10:44:25.823 回答
0

这是一个 XSLT 1.0 解决方案,它使用FXSL提供的标记化(它自己用 XSLT 1.0 编写)和xxx:node-set()正在使用的 XSLT 1.0 处理器提供的扩展功能:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 exclude-result-prefixes="ext">
  <xsl:import href="strSplit-to-Words.xsl"/>
  <xsl:output indent="yes" omit-xml-declaration="yes"/>

   <xsl:strip-space elements="*"/>
   <xsl:output indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/">
      <xsl:variable name="vwordNodes">
        <xsl:call-template name="str-split-to-words">
          <xsl:with-param name="pStr" select="/"/>
          <xsl:with-param name="pDelimiters"
                          select="' '"/>
        </xsl:call-template>
      </xsl:variable>

      <xsl:for-each select=
       "ext:node-set($vwordNodes)/*
         [not(contains(., '&quot;') or contains(.,':'))
        and
          count(preceding-sibling::*[contains(., '&quot;')]) mod 2 = 0
         ]">

        <xsl:value-of select="concat(., ' ')"/>
      </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档(提供的文本,包含在单个顶部元素中)时:

<t>boy &quot;happy family&quot; filetype:pdf girl</t>

产生了想要的正确结果

boy girl 

对于以下更复杂的 XML 文档,会产生相同的正确输出

<t>boy &quot; very happy family &quot; filetype:pdf girl</t>
于 2012-04-14T01:49:22.727 回答
0

http://exslt.org/regular-expressions对于 XSLT 1.0,名称空间中有替换(请参阅http://exslt.org/regexp/functions/replace/index.html),但正如 Martin 指出的那样,您的处理器需要对扩展的支持。

<xsl:value-of select="{http://exslt.org/regular-expressions}replace(STRING, '&quot;.*&quot;|\w+:\w+', '')"/>

会给你所要求的。

于 2012-04-13T11:13:45.290 回答