为什么 '<input pattern=“^[^ ]{2,}.*[^ ]$”>' 触发 “XPath 处理错误:预期二进制运算符”?

Why does `<input pattern="^[^ ]{2,}.*[^ ]$">` trigger "XPath processing error: Binary operator expected"?

提问人:U. Windl 提问时间:11/3/2023 更新时间:11/3/2023 访问量:41

问:

我有带有XSL的XML文件来处理它。 使用像 这样的输入元素就可以正常工作。 但是,当我将其更改为 ,Firefox ESR 115.3.1 抱怨:<input pattern="^[^ ].*[^ ]$"><input pattern="^[^ ]{2,}.*[^ ]$">

Fehler beim Laden des Stylesheets: XPath-Verarbeitungsfehler: Binärer Operator erwartet:

(英语(最有可能):“加载样式表时出错:XPath 处理错误:应为二进制运算符:")

我完全不明白如何调试它,是什么触发了错误,以及如何修复它(当我之前添加反斜杠时,我收到了一条不同的错误消息,说“找到无效字符:”)。{}

更难理解的是,错误消息中缺少任何详细信息(如行、标记),当我尝试显示源代码时,我只得到一个空窗口。

几乎最小的例子

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="#default"?>
<xsl:stylesheet id="default" version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:test="test"
        exclude-result-prefixes="xsl test">
  <test:XML>
    <order>
    </order>
  </test:XML>

  <xsl:output method="html" encoding="UTF-8" indent="yes"/>

  <xsl:template match="/xsl:stylesheet">
    <xsl:apply-templates />
  </xsl:template>

  <xsl:template match="xsl:*" /><!-- ignore -->

  <xsl:template match="test:XML/order">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <body>
    <form>
      <input id="customer-name" type="text" name="i.user.name"
         size="25" maxlength="40" placeholder="Name"
         pattern="^[^ ]{2,}.*[^ ]$" required="required" />
    </form>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>
XSLT 模式匹配 HTML 输入

评论

0赞 Michael Kay 11/3/2023
关于您的评论“是什么让事情更难理解......”:在浏览器中运行 XSLT 不是理想的开发环境;尝试使用 XML IDE,例如 Oxygen。

答:

3赞 Martin Honnen 11/3/2023 #1

XSLT 使用大括号和属性值作为所谓的属性值模板来分隔嵌入的 XPath 表达式。因此,在 XSLT 中,在此类属性中,如果您想要一个文字 or ,则需要将它们加倍,例如 和 ,例如 .{}{}{{}}pattern="^[^ ]{{2,}}.*[^ ]$"

评论

0赞 U. Windl 11/3/2023
出于额外的好奇心:尽管有大括号,但在模式中还有其他我应该小心的字符吗?
0赞 Martin Honnen 11/3/2023
@U.Windl,这与 HTML 或元素及其属性无关,您使用的是 XSLT,并且允许在(文本结果)元素属性中使用属性值模板,因此您需要使用转义机制(即加倍)以确保它们从字面上插入到结果树中。XSLT还有一些其他的、通用的、基于XML的语法要求(如需要转义为和作为)。inputpattern<&lt;&&amp;