summaryrefslogtreecommitdiffstats
path: root/docs/xpath.rst
blob: 4ff166485490c3e63b153f20fe1dafc1ec94aee1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright (C) 2023 Nordix Foundation

.. DO NOT CHANGE THIS LABEL FOR RELEASE NOTES - EVEN THOUGH IT GIVES A WARNING
.. _xpath:


XPath
########

.. toctree::
   :maxdepth: 1

Introduction
============

In CPS , Xpath is a parameter used in several APIs, which allows us to retrieve JSON and XML data efficiently.
The XPath syntax provides us with the ability to navigate through the hierarchical structure of data used in CPS easily via specification of node names, values ,attributes etc.

Sample Yang Model
=================

.. code-block::

  module stores {
      yang-version 1.1;
      namespace "org:onap:ccsdk:sample";

      prefix book-store;

      revision "2020-09-15" {
          description
            "Sample Model";
      }
      container shops {

          container bookstore {

              leaf bookstore-name {
                  type string;
              }

              leaf name {
                  type string;
              }

              list categories {

                  key "code";

                  leaf code {
                      type uint16;
                  }

                  leaf name {
                      type string;
                  }

                  leaf numberOfBooks {
                      type uint16;
                  }

                  container books {

                      list book {
                          key title;

                          leaf title {
                              type string;
                          }
                          leaf price {
                              type uint16;
                          }
                          leaf-list label {
                              type string;
                          }
                          leaf-list edition {
                              type string;
                          }
                      }
                  }
              }
          }
      }
  }

**Note.** 'categories' is a Yang List and 'code' is its key leaf. All other data nodes are Yang Containers. 'label' and 'edition' are both leaf-lists.

Sample Data in Json
===================

.. code-block:: json

    {
      "shops": {
        "bookstore": {
          "bookstore-name": "Chapters",
          "name": "Chapters",
          "categories": [
            {
              "code": 1,
              "name": "SciFi",
              "numberOfBooks": 2,
              "books": {
                "book": [
                  {
                    "title": "2001: A Space Odyssey",
                    "price": 5,
                    "label": ["sale", "classic"],
                    "edition": ["1968", "2018"]
                  },
                  {
                    "title": "Dune",
                    "price": 5,
                    "label": ["classic"],
                    "edition": ["1965"]
                  }
                ]
              }
            },
            {
              "code": 2,
              "name": "Kids",
              "numberOfBooks": 1,
              "books": {
                "book": [
                  {
                    "title": "Matilda"
                  }
                ]
              }
            }
          ]
        }
      }
    }

Nodes
=====

- Xpaths uses 'nodes' to navigate through the data.
    - Nodes typically used in CPS:
        - container
        - list
        - leaf (CPS does not support addressing leaf nodes using XPath syntax)
- JSON data and XML data are node trees
    - the 'root node' contains all the configuration data nodes that exist at the top-level in all modules, serving as their parent node.

Relationships
=============

- Every node has a parent, not every node has a children
- Ancestor: a node's parent, parent's parent , parent's parent's parents …
    - In the given sample model and data, the top data node 'shops' is the ancestor of every other node
- Descendants: a node's children, children's children,  children's children's children
    - In the given sample model and data, the list node 'books' is a descendant of the container node 'books'

Supported XPath syntax in CPS
=============================

Selecting nodes
---------------

  - ``/``: Selects from the root node
    - **Note:** CPS uses absolute location path which means that XPath expression expected in CPS must start with / followed by the nodes leading to the node being selected.
  - ``@``: Selects attributes
    - **Note:** Providing the attribute value can be enclosed in quotations i.e. ``[@code=1]`` will provide same result as ``[@code='1']``

.. list-table::
   :header-rows: 1

   * - XPath
     - Description
     - Selected node(s) without descendants
   * - - /
       - /shops
     - Selects the root node
     - .. code-block:: json

            [
              {
                "book-store:shops": {}
              }
            ]
   * - /shops/bookstore
     - Selects the bookstore container node
     - .. code-block:: json

            [
              {
                "book-store:bookstore": {
                  "name": "Chapters",
                  "bookstore-name": "Chapters"
                }
              }
            ]
   * - /shops/bookstore/categories[@code='1']
     - Selects 'categories' list node in 'bookstore' container that contains the key attribute 'code=1'
     - .. code-block:: json

            [
              {
                "book-store:categories": {
                  "code": 1,
                  "name": "SciFi",
                  "numberOfBooks": 2
                }
              }
            ]
   * - /shops/bookstore/categories[@code='1']/books
     - Selects the 'books' container node in 'categories' list node in 'bookstore' container that contains the key attribute 'code=1'
     - .. code-block:: json

            [
              {
                "book-store:books": {}
              }
            ]