根据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中被允许。你能帮忙吗?
非常感谢,
我
答案 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的结束标记匹配。