XSD正则表达式:为什么使用XSLT解析到HTML时无法正常工作?

3

我有一个XML文件,它是“格式良好且有效的”(与XSD模式匹配,在http://xsdvalidation.utilities-online.info/进行了测试)。

我在XSD中使用以下代码行来限制<firstname>的XML输入:

<xsd:pattern value = "[A-Z][a-z]+" />
<xsd:minLength value = "2" />
<xsd:maxLength value = "25" />

因此,当<firstname>与正则表达式和长度限制不匹配时(例如,如果我在XML文件中输入“5”作为名字),上述网站将抛出错误并无法验证。

但是,当我将XML文件打开到Firefox中(使用XSL文件解析为HTML),它不会抛出错误,并且无论正则表达式和长度限制如何,都会显示在XML文件中输入的内容。

XSD模式不是用于在Web浏览器中进行错误检查的吗? 我需要在XSLT中使用限制而不是XSD吗?
3个回答

2

只有当您请求时,XSD验证才会发生。指定xsi:schemaLocation本身并不构成执行验证的请求(尽管有一些工具,例如Altova,会这样解释)。

实际上,我不知道任何能在浏览器内工作的XSD验证器,但这并不意味着没有。


啊,好的,所以仅仅指定一个 xsi:schemaLocation 实际上并不会做任何事情...那就是让我感到困惑的地方,没错。 - Ian Campbell

1
  • 您似乎在使用网络浏览器作为XML验证器,但实际上它并不是。因为网站非常多样化,且偶尔会违反各种规则,所以网络浏览器是非常容错的工具。

  • Firefox看到的不是XSL转换的输入内容,也就是有效或无效的XML文件,而是转换的输出结果,在您的计算机上不一定有效。XSL转换的工作是将文档转换为其他东西,在这种情况下是XHTML。尽管有用于验证XHTML的模式,但它肯定没有任何关于名字的限制,因此转换的输出很可能是有效的。

  • 在XML中,有“格式良好”(意味着文档在配对标签等方面确实是XML)和“有效性”之分,有效性是相对于特定模式的。这就是为什么您会看到短语“格式良好且有效”。

这个问题的重点是,如果处理的不是HTML而是XML,请使用支持验证的XML编辑器。浏览器可以显示任意XML,但仅限于此。如果您必须使用浏览器并显示来自XSLT的错误,可以按以下方式执行:

<xsl:message terminate='yes'>message here</message>

...但这与XSD毫无关系。那是一种不同的技术。


感谢您的澄清,@Jirka。我的困惑在于想知道在将XML文件解析为XHTML的过程中,XSD何时变得有用。我想,那么我应该使用另一种语言来检查XML是否有效,如果是,则通过XSLT将其解析为XHTML... - Ian Campbell
是否可以制作这样一个条件语句来决定何时使用XSLT,或者您是否需要有条件地创建一个带有XSLT导入声明的新XML文件? - Ian Campbell
1
@Ian - 有些工具会拒绝非格式良好的输入,有些则会拒绝格式良好但无效的输入。然而,如果你没有听到验证的讨论,则通常不会进行XSD验证。关于第二个评论,是的,您可以在XSLT中的条件语句中插入xsl:terminate。这些条件语句将执行等效的有效性检查。 - Jirka Hanika
1
没有xsl:terminate这样的指令。而xsl:message与有效性检查无关。 - Michael Kay
@Michael,上一个评论是个打字错误,但之前已经正确地表述为<xsl:message terminate='yes'>...。我在http://www.w3schools.com/xsl/el_message.asp上找到了有用的信息。 - Ian Campbell

1

XPath 2.0(以及XSLT 2.0)是一种强类型语言,其中所有内置和用户定义的模式类型都可以进行验证。

可以使用XSLT 2.0 SA(面向模式)处理器来强制执行模式类型验证

  1. 源XML文档。

  2. 传递给模板/(xsl:)函数或(外部)样式表的任何参数的值。

  3. 任何xsl:variable的值。

  4. 任何模板或xsl:function生成的结果

正确使用这些功能可以使转换结果的后续验证变得不必要


谢谢@Dimitre!但是,浏览器还不支持XSLT 2,我说的对吗? - Ian Campbell
1
Saxon-CE 使 XSLT 2.0 在所有现代浏览器上可用。然而,它不支持模式感知处理。 - Michael Kay
1
@IanCampbell:Michael Kay已经回答了你的问题。虽然浏览器中暂时不会有XSLT 2.0 SA,但是没有什么阻止我们在服务器端使用SA XSLT 2.0处理器。 - Dimitre Novatchev
这是非常有用的信息,感谢@Michael和Dimitre!我将开始学习Saxon-CE,因为它不仅与所有浏览器兼容并支持XSLT 2.0,而且还提到它使HTML5更易于使用。在http://www.saxonica.com/welcome/welcome.xml上,我看到Saxon-CE“在启用JavaScript的任何现代浏览器中工作 - 包括移动设备”...然而,您平均的IE用户可能没有启用JavaScript,无法查看此类页面吗? - Ian Campbell
1
@IanCampbell:这是一种可能性,通常一个Web应用程序有两套页面--一套是针对启用了Javascript的浏览器,另一套(通常是简化版本)是针对禁用了Javascript的浏览器。 - Dimitre Novatchev
1
我认为JavaScript现在被广泛部署,因此禁用JavaScript的用户将会有一个令人失望的网络体验。但我想可能有一些安全偏执的公司坚持以这种方式配置他们的个人电脑。 - Michael Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接