首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在非匹配子字符串-XSLT2.0中包括分析-字符串

在非匹配子字符串-XSLT2.0中包括分析-字符串
EN

Stack Overflow用户
提问于 2014-02-24 11:47:32
回答 2查看 2.4K关注 0票数 2

正如here中所建议的,在<xsl:non-matching-substring>中包含<xsl:analyze-string>似乎是可能的。在我的例子中,我有两个regex 'AND facet_(.*?):\(("?.*?"?)\)''AND NOT facet_(.*?):\(("?.*?"?)\)',它们用于构造两个不同的Solr faceting请求以供我的web应用程序使用,后者是通过排除(而不是)。

这是我的XML:

代码语言:javascript
复制
   <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>

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

代码语言:javascript
复制
<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>,但是返回时总是会出现语法错误。例如:

代码语言:javascript
复制
    <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中是否真的允许这样做。你能帮上忙吗?

非常感谢,

我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-24 11:59:10

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

xsl:analyze string指令的内容必须采用以下形式之一: 单个xsl:匹配-子字符串指令,后面是零或多个xsl:回退指令单个xsl:非匹配-子字符串指令,后面是零或多个xsl:fallback指令-单个xsl:匹配-子字符串指令,然后是单个xsl:非匹配-子字符串指令,后面是零或更多。 xsl:回退指令 如果xsl: XTSE1130 -string指令既不包含xsl:matching子字符串,也不包含xsl:非匹配-子字符串元素,则这是一个静态错误。

所以,不要直接将一个xsl:choose放在其中,而是xsl:matching-substring和/或xsl:non-matching-substring,如果需要的话,它可以接受任何序列构造函数,这当然允许xsl:choose

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

代码语言:javascript
复制
<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>

票数 4
EN

Stack Overflow用户

发布于 2014-02-24 13:49:24

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21986857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档