【问题标题】:Can I use regular expressions in XML Schema element names?我可以在 XML Schema 元素名称中使用正则表达式吗?
【发布时间】:2012-12-18 14:52:10
【问题描述】:

我正在尝试为我通过的一段代码生成的 XML 创建一个 XML 模式。我将描述我的问题的简化版本。假设这段代码生成的 XML 文件描述了一个文本文档;它看起来像这样:

<document>
  <r1>A line of text</r1>
  <r2 style="bold">Another line which is bold</r2>
  <r3>Yet another line</r3>
</document>

等等。我知道,这不是最好的设计——如果行号是属性会更好,但这就是我必须使用的。它代表了问题所在的行号。有没有办法编写一个模式,让我为 元素名称 指定正则表达式(或类似表达式)?我希望 XSD 文件看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/SimpleSchema" 
        xmlns:tns="http://www.example.org/SimpleSchema" 
        elementFormDefault="qualified">
    <xs:element name="document">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="rX" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="style" type="xs:string" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
 </xs:schema>

...第 9 行的“rX”是表示“一个以 r 开头并以 X 结尾的名称,这是一个整数”所需的任何表达式.

我宁愿避免自己修复生成代码,所以我想看看是否可以先编写一个合适的 XML Schema。在此先感谢大家。

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    XSD 要求按字面意思指定元素名称;不支持我认为您想到的那种声明。

    正如您所描述的(一个以 r 开头并以 X 结尾的名称,它是一个整数),您要编写的声明将在架构中产生无限数量的元素组件;我所知道的唯一支持这种东西的语法形式是 Aard van Wijngaarden 为 Algol 68 开发的两级语法。

    因此,从短期来看,您最好的选择似乎是更改生成代码,或者为所需声明发明自己的符号并从中生成合法的 XSD 架构文档。

    【讨论】:

    • 我想我最终会这样做。
    【解决方案2】:

    在 XSD 1.1 中,您可以使用 xs:any 来允许具有任何名称的元素,然后使用断言将名称限制为与正则表达式匹配的名称:

        <xs:complexType>
            <xs:sequence>
                <xs:any minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:assertion test="every $x in * 
                                satisfies matches(local-name($x), '[Rr][0-9]+')"/>
        </xs:complexType> 
    

    XSD 1.1 目前在 Xerces(测试版)和 Saxon (9.4) 中实现。

    【讨论】:

    • 很有趣,但我不确定我是否可以使用 XSD 1.1。不幸的是,我的双手被束缚在使用哪些工具和库上。我会检查的。
    【解决方案3】:

    我不太熟悉 XSD 文件的 RegEx 功能,但表达式本身相当简单。

    这将捕获“rX”行号。

    <([Rr][0-9]{1,})>
    

    如果您不能使用捕获组,您可以简单地使用它。

    [Rr][0-9]{1,}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      • 2013-05-23
      • 2014-12-08
      • 1970-01-01
      • 2011-02-06
      • 2021-06-20
      • 1970-01-01
      相关资源
      最近更新 更多