2014-02-24 58 views
2

正如here中所建议的,似乎可以在<xsl:non-matching-substring>中包含<xsl:analyze-string>。在我的情况下,我有两个正则表达式'AND facet_(.*?):\(("?.*?"?)\)''AND NOT facet_(.*?):\(("?.*?"?)\)',它们用于构建两个不同的Solr分面请求供我的Web应用程序使用,后者通过排除(AND NOT)排除。在非匹配子字符串中包含分析字符串 - XSLT 2.0

这是我的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> 

在这种情况下,我返回了如下的错误:

The element type "xsl:analyze-string" must be terminated by the matching end-tag "".

我宁愿被卡住,我不知道这是否真的允许XSLT。你能帮我吗?

感谢的确,

回答

3

可以通过嵌套第二xsl:analyze-stringxsl:non-matching-substring如果你想,但当然任何xsl:analyze-string的内容必须遵循的规则

The content of the xsl:analyze-string instruction must take one of the following forms:

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:fallback instructions

[ERR XTSE1130] It is a static error if the xsl:analyze-string instruction contains neither an xsl:matching-substring nor an xsl:non-matching-substring element.

所以请勿直接在其中放置xsl:choose,而应该使用xsl:matching-substring和/或xsl:non-matching-substring,如果需要,可以使用任何顺序构造函数,这允许xsl:choose当然。

下面是一个完整的例子,是良好的XML和语法正确的XSLT:

<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> 

尝试使用XML编辑器或编辑器插件,它可以帮助得到适当的嵌套和标记完成应避免错误与错别字</xsl:matching-sustring>

+0

非常感谢。请参阅我的尝试,下面 – paranza

+1

我发布了一个语法正确的示例,希望有助于找到正确的XML和XSLT语法。请在您的问题中提供任何代码示例,而不是回答。并考虑使用XML编辑器来帮助您使用正确的语法。 –

+1

另外请注意,我没有尝试在这个答案实现某种匹配,我只是把正确的语法到位。我不知道你甚至需要一个嵌套分析字符串,因为通常我会期望它执行'

2

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