我目前有以下格式的XML:
<?xml version="1.0"?>
<trace_data>
<pinfo>1</pinfo>
<traces>
<P0>21:39:09.776762 clock_gettime(CLOCK_BOOTTIME, {68, 27131557}) = 0
</P0>
<P1>21:39:09.776831 epoll_ctl(4, EPOLL_CTL_DEL, 60, NULL) = 0
</P1>
<P2>21:39:09.776856 close(60) = 0
</P2>
</traces>
</trace_data>
过程元素(P0,P1等)应形成最多n个过程的序列(P0 ... Pn)
我现在正在尝试创建一个XSD来验证这些XML。另一个重要特征应该是每个过程的值应该以一个时间开始(例如21:39:09.123123)。
我提出了以下XSD,但无法弄清楚如何验证过程元素的值。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="https://www.w3schools.com"
xmlns="https://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="trace_data">
<xs:complexType>
<xs:element name = "pinfo" type="xs:string"/>
<xs:element name = "traces" type="Process"/>
</xs:complexType>
</xs:element>
<!-- <THIS DESCRIBES P0 to Pn FOR WINDOWSIZE n> -->
<xs:complexType name="Process">
<xs:sequence>
<xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
<xs:assert test=" "
</xs:complexType>
<!-- <PROCESS ENDS HERE> -->
</xs:schema>
任何人都可以帮助我或指出我正确的方向吗?
提前致谢。
设计这种XML格式的人并没有考虑在XSD中使用什么,或者就任何其他XML工具而言。使用像这样的结构化元素名称感觉就像一个聪明的主意,但实际上是一个彻底的麻烦。
一种方法是将验证作为一个两步过程进行:首先将XML转换为更传统的(并且更容易处理):
<traces>
<P nr="0" time="21:39:09.776762">clock_gettime(CLOCK_BOOTTIME, {68, 27131557}) = 0</P>
<P nr="1" time="21:39:09.776831">epoll_ctl(4, EPOLL_CTL_DEL, 60, NULL) = 0</P>
...
</traces>
然后将XSD应用于结果,现在更加直截了当。
虽然您仍然需要XSD 1.1断言来验证数字是否形成正确的序列:
<xsd:assert test="not(P[position() != @nr + 1])"/>