正如here中所建议的,在<xsl:non-matching-substring>中包含<xsl:analyze-string>似乎是可能的。在我的例子中,我有两个regex 'AND facet_(.*?):\(("?.*?"?)\)'和'AND NOT facet_(.*?):\(("?.*?"?)\)',它们用于构造两个不同的Solr faceting请求以供我的web应用程序使用,后者是通过排除(而不是)。
这是我的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中是否真的允许这样做。你能帮上忙吗?
非常感谢,
我。
发布于 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:
<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>。
发布于 2014-02-24 13:49:24
在编写XSLT之前,您必须学习如何编写XML。名为xsl:analyze string的开始标记不能与名为xsl: start的结束标记匹配。
https://stackoverflow.com/questions/21986857
复制相似问题