应用带有子字符串的模板

apply-templates with substring

我正在努力实现以下目标: 需要缩短解析为模板的字符串值。我想缩短值并应用它。

   <xsl:template name="replace-strings">
      <xsl:param name="text" />     

(...)

   <xsl:variable name="cleaned_text">
        <xsl:value-of select="substring-before($text, '(~)')" />
     </xsl:variable>          
      
      <xsl:choose>
         <xsl:when test="contains($text,'(~)')">
            <xsl:apply-templates select="$cleaned_text" />
         </xsl:when>              
         <xsl:otherwise>
            <xsl:apply-templates select="." />
         </xsl:otherwise>
      </xsl:choose>

这个不行,报错

ERROR http-nio-8080-exec-2 org.apache.fop.fo.FOTreeBuilder - org.xml.sax.SAXParseException; lineNumber: 0; columnNumber: 0; #STRING cannot be converted to NodeList! (translated)

当我应用 $text 变量时,代码按预期工作。如何在不影响注释结构的情况下缩短 $text 变量中的字符串?抱歉,如果这没有太大意义,我仍在尝试使用这种语言找到自己的方式。

您正在尝试将模板应用于 substring-before() 返回的字符串。您只能在节点上使用 xsl:apply-templates(这是错误消息试图告诉您的内容)。

如果将 xsl:apply-templates 更改为 xsl:value-of,则模板的结果将是缩短的字符串或当前节点的字符串值。

(您可能需要 $text 的字符串值。)