2017-04-13 61 views
1

我有以下XML:如何让XML元素通过XSD出现在任何地方?

<root> 
    <someNode> 
    <someChild attr="val" /> 
    </someNode> 

    <otherNode> 
    <otherChild> 
     <otherSubChild /> 
    </otherChild> 
    </otherNode> 
</root> 

这方面的一个有效的XML模式会很容易。现在的问题是,我的程序必须支持解析文件时评估的特殊元素,并导致元素的条件替换。

例子:

<root> 
     <someNode> 
     <if environment="DEV"> 
      <someChild attr="val" /> 
     </if> 
     <if environment="PROD"> 
      <someChild attr="otherVal" /> 
     </if> 
     </someNode> 

     <otherNode> 
     <otherChild> 
      <if environment="DEV"> 
      <otherSubChild /> 
      </if> 
     </otherChild> 
     </otherNode> 
    </root> 

我觉得你的想法。事实是,在if元素是允许在XML出现到处,但允许包括这是允许它被放在元素任何元素的同时,

我如何定义这在一个好方法?目前,我的XML模式中有大约90种类型/元素,手动编辑每种类型/元素以允许允许正确的子元素的if元素会非常麻烦。

是否有可能制定一个架构,允许if元素如上所述?

回答

1

因此,您已经指定了内容模型的层次结构,具体说明哪些元素可以出现在其他元素中,以什么数量以及可能以何种顺序出现。现在你想添加,顺便说一句,一个if元素可以包装任何现有的元素在任何地方?

你不能在XSD中做到这一点。无法修改这些特定指令,或者没有事先为这种可能性做出规定,您无法以这种方式在全球范围内解决所有特定约束。 (例如,如果您定义了一个element substitution group,可能会在您的文档中出现多个位置,则可以轻松地向该组添加新成员。)

有一种方法可以说任何元素都可以出现在指定位置一个内容模型(xs:any),但是没有办法说给定的元素可以出现在所有内容模型的任何地方。在XSD 1.1中,有一种允许在内容模型中使用open content的新机制,但这也允许使用前瞻性规定,而不是追溯性全局调整。

一个建议可能是在XML的with-if和without-if形式之间编写一个简单的XSLT转换并分别验证这些文档。

另一种方法是将您的条件表达为将出现在任何元素上的属性,而不是可以包裹任何其他元素的元素。这仍然需要更新到您的XSD,但更新会更容易做到,同时保留现有的内容模型。

+0

使用属性()听起来很有希望。我会评估这是否涵盖了我的需求。 – user826955

0

也许您可以尝试为<if>元素及其属性定义基本complexType,然后将<someChild><otherChild>声明为此类型的扩展。