在非匹配子字符串中包含analyze-string - XSLT 2.0

时间:2014-02-24 11:47:32

标签: regex xslt solr xslt-2.0

根据here的建议,似乎可以在<xsl:analyze-string>中加入<xsl:non-matching-substring>。在我的例子中,我有两个正则表达式'AND facet_(.*?):\(("?.*?"?)\)''AND NOT facet_(.*?):\(("?.*?"?)\)',它们用于构造我的Web应用程序要使用的两个不同的Solr faceting请求,后者是排除(AND NOT)。

这是我的XML:

   <facets>
      <facet name="domain">
        <facetEntry count="8007">domain1.co.uk</facetEntry>
        <facetEntry count="6497">domain2.co.uk</facetEntry>
        <facetEntry count="6180">domain3.co.uk</facetEntry>            
      </facet>
   <facets>

然而,这是我正在使用的模板:

<xsl:template name="facets">
                <xsl:param name="q" />
                <xsl:analyze-string select="$q" regex='AND facet_(.*?):\(("?.*?"?)\)'>
                        <xsl:matching-substring>
                        <xsl:choose>
                                <xsl:when test="regex-group(1) = 'example1'">
                                    <facet name="domain"><xsl:value-of select="regex-group(2)" /></facet>
                                </xsl:when>
                                <xsl:when test="regex-group(1) = 'example2'">
                                    <facet name="content_type_norm"><xsl:value-of select="regex-group(2)" /></facet>
                                </xsl:when>
                                <xsl:when test="regex-group(1) = 'example2'">
                                    <facet name="sentiment"><xsl:value-of select="regex-group(2)" /></facet>
                                </xsl:when>
                        </xsl:choose>
                        </xsl:matching-substring>
                       <xsl:non-matching-substring></xsl:non-matching-substring>
                </xsl:analyze-string>
    </xsl:template>

我已多次尝试在内部添加<xsl:analyze-string>,但我总是返回语法错误。例如:

    <xsl:non-matching-substring>
                           <xsl:analyze-string select="$q" regex='AND NOT facet_(.*?):\(("?.*?"?)\)'>
<xsl:choose>
                                    <xsl:when test="regex-group(1) = 'example1'">
                                        <facet name="domain"><xsl:value-of select="regex-group(2)" /></facet>
                                    </xsl:when>
                                    <xsl:when test="regex-group(1) = 'example2'">
                                        <facet name="content_type_norm"><xsl:value-of select="regex-group(2)" /></facet>
                                    </xsl:when>
                                    <xsl:when test="regex-group(1) = 'example2'">
                                        <facet name="sentiment"><xsl:value-of select="regex-group(2)" /></facet>
                                    </xsl:when>
                            </xsl:choose>
                         </xsl:non-matching-substring>
                    </xsl:analyze-string>

在这种情况下,我返回时出现以下错误:

  

元素类型“xsl:analyze-string”必须以   匹配结束标记“”。

我很困惑,我不确定这是否真的在XSLT中被允许。你能帮忙吗?

非常感谢,

2 个答案:

答案 0 :(得分:3)

如果您愿意,可以将第二个xsl:analyze-string嵌套到xsl:non-matching-substring,但当然任何xsl:analyze-string的内容都必须遵守规则

  

xsl:analyze-string指令的内容必须采用其中一个   以下表格:

A single xsl:matching-substring instruction, followed by zero or more xsl:fallback instructions

A single xsl:non-matching-substring instruction, followed by zero or more xsl:fallback instructions

A single xsl:matching-substring instruction, followed by a single xsl:non-matching-substring instruction, followed by zero or more
     

xsl:后备说明

     

[ERR XTSE1130]如果是xsl:analyze-string,则为静态错误   指令既不包含xsl:matching-substring也不包含   xsl:non-matching-substring元素。

所以不要直接在其中放置xsl:choose,而是xsl:matching-substring和/或xsl:non-matching-substring,如果需要,可以使用任何序列构造函数,这允许{{1}当然。

这是一个完整的示例,它是格式正确的XML和语法正确的XSLT:

xsl:choose

尝试使用XML编辑器或编辑器插件,它有助于获得正确的嵌套,并且标记完成应该避免像<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:template name="facets"> <xsl:param name="q" /> <xsl:analyze-string select="$q" regex='AND facet_(.*?):\(("?.*?"?)\)'> <xsl:matching-substring> <xsl:choose> <xsl:when test="regex-group(1) = 'example1'"> <facet name="domain"><xsl:value-of select="regex-group(2)" /></facet> </xsl:when> <xsl:when test="regex-group(1) = 'example2'"> <facet name="content_type_norm"><xsl:value-of select="regex-group(2)" /></facet> </xsl:when> <xsl:when test="regex-group(1) = 'example2'"> <facet name="sentiment"><xsl:value-of select="regex-group(2)" /></facet> </xsl:when> </xsl:choose> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:analyze-string select="$q" regex='AND NOT facet_(.*?):\(("?.*?"?)\)'> <xsl:matching-substring> <xsl:choose> <xsl:when test="regex-group(1) = 'example1'"> <facet name="domain"><xsl:value-of select="regex-group(2)" /></facet> </xsl:when> <xsl:when test="regex-group(1) = 'example2'"> <facet name="content_type_norm"><xsl:value-of select="regex-group(2)" /></facet> </xsl:when> <xsl:when test="regex-group(1) = 'example2'"> <facet name="sentiment"><xsl:value-of select="regex-group(2)" /></facet> </xsl:when> </xsl:choose> </xsl:matching-substring> </xsl:analyze-string> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:template> </xsl:stylesheet> 这样的拼写错误。

答案 1 :(得分:2)

在编写XSLT之前,您必须学习如何编写XML。名为xsl:analyze-string的开始标记不能与名为xsl:choose的结束标记匹配。