對嵌套元素進行不一致的XSD驗證我正在研究一種工具來幫助用戶編寫與JSP文件性質相似的XHTML-ish文檔。這些文檔是XML文檔,可以在XHTML命名空間中包含任何格式正確的標籤,並且它們之間編織的是我產品命名空間中的元素。除此之外,該工具使用XSD驗證輸入。使用'<xs:any>'
例輸入:
<?xml version="1.0"?>
<markup>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:c="https://my_tag_lib.example.com/">
<c:section>
<c:paragraph>
<span>This is a test!</span>
<a href="http://www.google.com/">click here for more!</a>
</c:paragraph>
</c:section>
</html>
</markup>
我的問題是,XSD驗證不行爲一致取決於我窩有多深的元素。我想要的是https://my_tag_lib.example.com/
命名空間中的所有元素都要根據模式進行檢查,而命名空間http://www.w3.org/1999/xhtml
中的任何元素都可以被寬鬆地容忍。我不想列出在我的XSD中允許使用的所有HTML元素 - 用戶可能想要使用僅在某些瀏覽器上可用的模糊元素等。相反,我只想列出使用<xs:any>
屬於名稱空間的任何元素。
我發現的是,在某些情況下,屬於my_tag_lib
名稱空間但未出現在模式中的元素是通過驗證,而出現在模式中的其他元素可以通過給出他們無效的屬性。
因此: *針對XSD模式驗證有效元素 *驗證程序跳過了無效元素?
例如,這個通過驗證:
<?xml version="1.0"?>
<markup>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:c="https://my_tag_lib.example.com/">
<c:section>
<div>
<c:my-invalid-element>This is a test</c:my-invalid-element>
</div>
</c:section>
</html>
</markup>
但後來這個驗證失敗:
<?xml version="1.0"?>
<markup>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:c="https://my_tag_lib.example.com/">
<c:section>
<div>
<c:paragraph my-invalid-attr="true">This is a test</c:paragraph>
</div>
</c:section>
</html>
</markup>
爲什麼屬性進行驗證的架構爲公認的元素,而未知的元素看似不得到消毒了嗎?這裏的邏輯是什麼?我一直在使用xmllint
做驗證:
xmllint --schema markup.xsd example.xml
這裏是我的XSD文件:
文件:markup.xsd
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xs:import namespace="http://www.w3.org/1999/xhtml" schemaLocation="html.xsd" />
<xs:element name="markup">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element ref="xhtml:html" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
文件:html.xsd
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3.org/1999/xhtml">
<xs:import namespace="https://my_tag_lib.example.com/" schemaLocation="my_tag_lib.xsd" />
<xs:element name="html">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:any processContents="lax" namespace="http://www.w3.org/1999/xhtml" />
<xs:any processContents="strict" namespace="https://my_tag_lib.example.com/" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
文件: my_tag_lib.xsd
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://my_tag_lib.example.com/">
<xs:element name="section">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:any processContents="lax" namespace="http://www.w3.org/1999/xhtml" />
<xs:any processContents="strict" namespace="https://my_tag_lib.example.com/" />
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="paragraph">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:any processContents="lax" namespace="http://www.w3.org/1999/xhtml" />
<xs:any processContents="strict" namespace="https://my_tag_lib.example.com/" />
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
因此,無法強制一個名稱空間中的所有元素都是嚴格的 - 它都基於當前上下文嗎? –
@RichardJPLeGuen,那是對的。 –