【发布时间】:2012-09-26 22:56:07
【问题描述】:
我为消息传递应用程序定义了一个 XSD。作为消息负载的一部分,我需要要求,对于我的元素之一,内容是 XSL 样式表。稍后将在应用 XSL 转换以生成最终格式化输出时使用它。请注意,XSL 样式表的有效负载是最终用户的决定,因此我不能简单地制作 XSD 来验证其内容。理想情况下,如果有 HTML 的 XSD 会很棒,因为我会简单地将它用作样式表中非 XSL 内容的命名空间!
因此,我这样做了(这只是 XSD 的一部分,但你明白了):
<?xml version="1.0" encoding="Windows-1252"?>
<xs:schema targetNamespace="http://schemas.mycorpname.com/notification"
attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://schemas.mycorpname.com/notification">
<xs:import namespace="http://www.w3.org/1999/XSL/Transform" />
<xs:complexType name="renderinginstructions">
<xs:sequence>
<xs:element ref="xsl:stylesheet"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
这很好用,并强制消费者在 <renderinginstructions> 元素中包含 XSL 样式表。
大多数时候,XSL 样式表应该包含标签以输出有效的 HTML 文档。但是,当我将子元素放入样式表定义中时,我从 Visual Studio 收到此错误:
如果我想要求存在嵌入式 XSL 样式表(而不是任何其他内容!),我是否正确创建了我的 XSD?我还可以做些什么?我不喜欢这个警告。
以下是引发此警告的文档类型示例。
注意:在样式表中,如果我使用 xmlns="",我只会收到警告。如果我没有指定默认命名空间,我不会收到警告,但我会从 Visual Studio 收到一条“消息”,说明:
"找不到元素的架构信息 'http://schemas.mycorpname.com/notification:html'"。
所以,使用xmlns="",我会收到警告。没有它,我会得到大量的“消息”,所有这些都与 xsl:template 的子元素有关。 XSLT 的目的不就是能够在文档中放入大量不同的元素吗? XSLT 独立时是否不受模式验证的影响?
<?xml version="1.0"?>
<notification xmlns="http://schemas.mycorpname.com/notification">
<renderinginstructions>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="">
<xsl:template match="/">
<html>
<head>This is the head</head>
<body>This is the body.</body>
</html>
</xsl:template>
</xsl:stylesheet>
</renderinginstructions>
</notification>
【问题讨论】:
-
棘手的一个..您是否尝试将 html 命名空间而不是 xmlns="" 放在您的
xsl:stylesheet元素中? -
这是个好主意,我对此进行了研究,但找不到 HTML 的 XSD!如果你知道 URI,我一定会添加它并试一试!
-
<html xmlns="http://www.w3.org/1999/xhtml">我想你实际上可以通过在VS中创建一个新的html文档来找到它,默认情况下它可能会在顶部。 -
这看起来像 XHTML 命名空间。这行得通吗?
标签: xml visual-studio-2010 xslt xsd