【问题标题】:xsd unique selector path: exclude specific elements [closed]xsd 唯一选择器路径:排除特定元素
【发布时间】:2012-07-27 08:13:20
【问题描述】:

我有以下 xml 和 xsd 作为我的问题的基本示例:

XML

  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="2" />
      </childgroup>
      <child id="5" />
    </parent>


    <parent id="2">
      <childgroup id="33">
        <child id="1" />
        <child id="4" />
      </childgroup>
      <child id="1" />
      <child id="5" />
      <childgroup id="4">
        <child id="1" />
        <child id="6" />
      </childgroup>
    </parent>

  </parentgroup>

XSD

<xsd:element name="parentgroup" type="parentgroup">
    <xsd:unique name="UniqueParentId">
      <xsd:selector xpath="child::parent"></xsd:selector>
      <xsd:field xpath="@id"></xsd:field>
    </xsd:unique>
  </xsd:element>

  <xsd:complexType name="parentgroup">
    <xsd:sequence maxOccurs="unbounded">
      <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath=".//*"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>
    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

  <xsd:complexType name="parent">
    <xsd:choice maxOccurs="unbounded" minOccurs="1">
      <xsd:element name="child" type="child" maxOccurs="unbounded" minOccurs="1"></xsd:element>
      <xsd:element name="childgroup" type="childgroup" maxOccurs="unbounded" minOccurs="1"></xsd:element>

    </xsd:choice>

    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

  <xsd:complexType name="childgroup">
    <xsd:sequence maxOccurs="unbounded">
      <xsd:element name="child" type="child" maxOccurs="unbounded" minOccurs="1"></xsd:element>

    </xsd:sequence>
    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

  <xsd:complexType name="child">
    <xsd:attribute name="id" type="xsd:int" />
  </xsd:complexType>

任务

  1. 所有父母都有一个唯一的“id”属性。并且没有孩子具有相同的“id”属性。像他的父母一样。
  2. 父项中的子项和子组具有唯一的“id”属性。不包括 Childgroup 中的 Childs。 (id 在第一个深度加上父级是唯一的)
  3. 子组中的子项具有唯一的“id”属性。 (因此允许子组中的子项的 id 等于同一父项中子组外的子项的 id,但不允许与自己的子组的 id 相同,如 2. point [(ids are在第一个深度加上父级中唯一)])

1。问题

第 1 点和第 2 点很清楚,但我不知道如何排除子组的后代,我尝试跟随但总是出现 xpath 语法错误

第一次尝试
     <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath=".//*[not(childgroup)]"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>
第二次尝试
     <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath=".//*[not(child::childgroup)]"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>
第三次尝试
     <xsd:element name="parent" type="parent" maxOccurs="unbounded" minOccurs="1">

        <xsd:unique name="UniqueChildId">
          <xsd:selector xpath="child::*[not(childgroup)]"></xsd:selector>
          <xsd:field xpath="@id"></xsd:field>
        </xsd:unique>

      </xsd:element>

感谢您的帮助!

无效的 Xml

例1
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="7">
        <child id="5" />
        <child id="6" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="9" />
      </childgroup>
      <child id="12" />
      <child id="13" />
      <childgroup id="14">
        <child id="15" />
        <child id="16" />
      </childgroup>
    </parent>

  </parentgroup>
原因
  1. 无效,因为在第一个父级中:childgroup id="7" 与 child id="7" 具有相同的 id
  2. 无效,因为在第二个父母中:孩子 id="9" 与他的“父亲”childgroup id="9" 具有相同的 id
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="7" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="8" />
      </childgroup>
      <child id="12" />
      <child id="14" />
      <childgroup id="14">
        <child id="15" />
        <child id="16" />
      </childgroup>
    </parent>

  </parentgroup>
原因
  1. 无效,因为在第二个父级中:childgroup id="14" 与 child id="14" 具有相同的 id
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="7" />
      <childgroup id="4">
        <child id="5" />
        <child id="6" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="11" />
      </childgroup>
      <child id="12" />
      <child id="14" />
      <childgroup id="15">
        <child id="16" />
        <child id="11" />
      </childgroup>
    </parent>

  </parentgroup>
原因
  1. 无效,因为在第一个父项中:child id="7" 与 child id="7" 具有相同的 id
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="1" />
        <child id="2" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=9">
        <child id="10" />
        <child id="11" />
      </childgroup>
      <child id="12" />
      <child id="14" />
      <childgroup id="9">
        <child id="16" />
        <child id="11" />
      </childgroup>
    </parent>

  </parentgroup>
原因
  1. 无效,因为在第二个父项中:childgroup id="9" 与 childgroup id="9" 具有相同的 id

有效 Xml

例1
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="6" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=1">
        <child id="2" />
        <child id="3" />
      </childgroup>
      <child id="4" />
      <child id="5" />
      <childgroup id="6">
        <child id="7" />
        <child id="9" />
      </childgroup>
    </parent>

  </parentgroup>
例2
  <parentgroup>

    <parent id="1">
      <child id="2" />
      <child id="3" />
      <childgroup id="4">
        <child id="5" />
        <child id="7" />
      </childgroup>
      <child id="7" />
    </parent>


    <parent id="8">
      <childgroup id=1">
        <child id="2" />
        <child id="5" />
      </childgroup>
      <child id="4" />
      <child id="5" />
      <childgroup id="6">
        <child id="2" />
        <child id="5" />
      </childgroup>
    </parent>

  </parentgroup>

【问题讨论】:

  • 我看到您试图编辑我的回复,以改进您的问题。根据我从您的编辑中收集到的信息,您想要一些不同的方式,而您的初始示例 XML/XSD 和叙述没有捕捉到。您必须记住的是,对于您从字面上提出的问题,答案是正确的。由您决定是否更新问题,创建一个新问题来捕捉您的不同/通用场景,和/或一起删除这个问题;你需要明白答案肯定帮助你至少理解了如何表达一个更好的问题。
  • 不抱歉,这不正确,我不想编辑你的答案,我只是想给出一个答案,我现在不知道这是怎么发生的,抱歉。
  • 不抱歉那不正确,我不想编辑你的答案,我只是想给出一个答案,我现在不知道这怎么会发生,抱歉,但你可以猜到我是新手。回到我的问题,我在问如何排除 xpath 后代自我选择的一个特殊后代节点,我尽力解释自己,如果您误解了我,我很抱歉,并感谢您清理我的标记和试图帮助我,但是,您只是向我展示了如何简单地选择一些节点,但是我看到了您想要从我这里得到什么,我将尝试另一个板并单击“此答案对您有用”。
  • 重读任务部分,我还是不明白有什么不适合你的。您能否使用示例 XML 更新您的问题,该示例 XML 是 i) 根据 Task 描述无效,并且 ii) 通过我提供的 XSD 的验证?
  • @Petru 我现在用几个例子来编辑我的问题。

标签: xml xpath xsd selector unique


【解决方案1】:

我已清理并更正了您的错误。下面是与发布的 XML 一起使用的新 XSD 以及我理解它们的方式的要求。我希望下图可以帮助您更好地可视化约束和您应该使用的 XPath。

修改后的 XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com)-->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="parentgroup" type="parentgroup">
        <xsd:unique name="UniqueParentId">
            <xsd:selector xpath="parent"/>
            <xsd:field xpath="@id"/>
        </xsd:unique>
    </xsd:element>

    <xsd:complexType name="parentgroup">
        <xsd:sequence maxOccurs="unbounded">
            <xsd:element name="parent" type="parent" maxOccurs="unbounded">
                <xsd:unique name="UniqueChildId">
                    <xsd:selector xpath=".|childgroup|child"/>
                    <xsd:field xpath="@id"/>
                </xsd:unique>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>

    <xsd:complexType name="parent">
        <xsd:choice maxOccurs="unbounded">
            <xsd:element name="child" type="child" maxOccurs="unbounded"/>
            <xsd:element name="childgroup" type="childgroup" maxOccurs="unbounded">
                <xsd:unique name="UniqueChildIdInChildGroup">
                    <xsd:selector xpath=".|child"/>
                    <xsd:field xpath="@id"/>
                </xsd:unique>
            </xsd:element>
        </xsd:choice>
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>

    <xsd:complexType name="childgroup">
        <xsd:sequence maxOccurs="unbounded">
            <xsd:element name="child" type="child" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>

    <xsd:complexType name="child">
        <xsd:attribute name="id" type="xsd:int"/>
    </xsd:complexType>
</xsd:schema>

更新:XSD 适用于所有示例 XML。以下是 QTAssistant 对每一项的评价:

无效: 例如。 1:

Error occurred while loading [], line 9 position 4 There is a duplicate key sequence '7' for the 'UniqueChildId' key or unique identity constraint. Error occurred while loading [], line 15 position 5 There is a duplicate key sequence '9' for the 'UniqueChildIdInChildGroup' key or unique identity constraint. ParentChildChildGroup-Inv-Eg1.xml is invalid.

例如2:

Error occurred while loading [], line 21 position 5 There is a duplicate key sequence '14' for the 'UniqueChildId' key or unique identity constraint. ParentChildChildGroup-Inv-Eg2.xml is invalid.

例如2(3?):

Error occurred while loading [], line 9 position 4 There is a duplicate key sequence '7' for the 'UniqueChildId' key or unique identity constraint. ParentChildChildGroup-Inv-Eg3.xml is invalid.

例如2(4?):

Error occurred while loading [], line 21 position 5 There is a duplicate key sequence '9' for the 'UniqueChildId' key or unique identity constraint. ParentChildChildGroup-Inv-Eg4.xml is invalid.

您所描述的有效 XML 已成功验证。

【讨论】:

  • 不抱歉那不正确,我不想编辑你的答案,我只是想给出一个答案,我现在不知道这怎么会发生,抱歉,但你可以猜到我是新手。回到我的问题,我在问如何排除 xpath 后代自我选择的一个特殊后代节点,我试图尽可能地解释自己,如果您误解了我,我很抱歉,并感谢您清理我的标记和试图帮助我,但是,您只是向我展示了如何简单地选择一些节点,但是我看到了您想要从我这里得到什么,我将尝试另一个板并单击“此答案对您有用”。
猜你喜欢
  • 1970-01-01
  • 2011-03-02
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多