我有像下面这样由 XSLT 解析的字符串
boy "happy family" filetype:pdf girl
从上面的字符串中,我只需要过滤掉“boy”和“girl”这两个单词,然后得到另一个字符串
boy girl
我该如何实现这一目标?
使用 XSLT 2.0,您可以replace
使用正则表达式的函数,所以这样做replace('boy "happy family" filetype:pdf girl', '"[^"]*"|\w+:\w+', '')
应该可以工作。对于 XSLT 1.0,我首先会检查您的 XSLT 1.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(., '"') or contains(.,':'))
and
count(preceding-sibling::*[contains(., '"')]) mod 2 = 0
]">
<xsl:value-of select="concat(., ' ')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档(提供的文本,包含在单个顶部元素中)时:
<t>boy "happy family" filetype:pdf girl</t>
产生了想要的正确结果:
boy girl
对于以下更复杂的 XML 文档,会产生相同的正确输出:
<t>boy " very happy family " filetype:pdf girl</t>
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, '".*"|\w+:\w+', '')"/>
会给你所要求的。