blob: aec87cd4362c76e22ae4d12d84bdea2b65b77b17 [file] [log] [blame]
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. DO NOT CHANGE THIS LABEL FOR RELEASE NOTES - EVEN THOUGH IT GIVES A WARNING
.. _design:
CPS Path
########
.. toctree::
:maxdepth: 1
Introduction
============
Several CPS APIs use the cps-path (or cpsPath in Java API) parameter.
The CPS Path parameter is used for querying xpaths. CPS Path is insprired by the `XML Path Language (XPath) 3.1. <https://www.w3.org/TR/2017/REC-xpath-31-20170321/>`_
This section describes the functionality currently supported by CPS Path.
Sample Data
===========
The xml below describes some basic data to be used to illustrate the CPS Path functionality.
.. code-block:: xml
<shops>
<bookstore name="Chapters">
<bookstore-name>Chapters</bookstore-name>
<categories code="1" name="SciFi" numberOfBooks="2">
<books>
<book name="Space Odyssee"/>
<book name="Dune"/>
</books>
</categories>
<categories code="2" name="Kids" numberOfBooks="1">
<books>
<book name="Matilda"/>
</books>
</categories>
</bookstore>
</shops>
**Note.** 'categories' is a Yang List and 'code' is its key leaf. All other data nodes are Yang Containers
General Notes
=============
- String values must be wrapped in quotation marks (U+0022) or apostrophes (U+0027).
- String comparisons are case sensitive.
Supported Queries
=================
Get List Elements by Any Attribute Value
----------------------------------------
**Syntax**: ``<xpath>/<target-node>[@<leaf-name>=<leaf-value>]``
- ``xpath``: The xpath to the parent of the target node including all ancestors.
- ``target-node``: The name of the (list) node which elements will queried.
- ``leaf-name``: The name of the leaf which value needs to be compared.
- ``leaf-value``: The required value of the leaf.
**Examples**
- ``/shops/bookstore/categories[@numberOfBooks=1]``
- ``/shops/bookstore/categories[@name="Kids"]``
- ``/shops/bookstore/categories[@name='Kids']``
**Limitations**
- Only one list (last descendant) can be queried for a non-key value. Any ancestor list will have to be referenced by its key name-value pair(s).
- Only one attribute can be queried.
- Only string and integer values are supported (boolean and float values are not supported).
**Notes**
- For performance reasons it does not make sense to query using key leaf as attribute. If the key value is known it is better to execute a get request with the complete xpath.
Get Any Descendant
------------------
**Syntax**: ``//<direct-ancestors><target-node>``
- ``direct-ancestors``: Optional path to direct ancestors of the target node. This can contain zero to many ancestor nodes separated by a /.
- ``target-node``: The name of the (list) node from which element will be selected. If the target node is a Yang List he element needs to be specified using the key as normal e.g. ``categories[@code=1]``.
**Examples**
- ``//book``
- ``//books/book``
- ``//categories[@code=1]``
- ``//categories[@code=1]/books``
**Limitations**
- List elements can only be addressed using the list key leaf.
Get Any Descendant by Any Attribute Value
-----------------------------------------
**Syntax**: ``//<direct-ancestors><target-node>[@<leaf-name>=<leaf-value>]``
- ``direct-ancestors``: Optional path to direct ancestors of the target node. This can contain zero to many ancestor nodes separated by a /.
- ``target-node``: The name of the (list) node which elements will queried.
- ``leaf1-name .. leafN-name:``: One or more leaves whose value needs to be compared.
- ``leaf1-value .. leafN-value:``: One or more required leaf values (multiple condition can be combined using the 'and' keyword).
**Examples**
- ``//categories[@name='Kids']``
- ``//categories[@name='Kids' and @numberOfBooks=1]``
**Limitations**
- Only string and integer values are supported (boolean and float values are not supported).
- Multiple attributes can only be combined using 'and'. 'or' and bracketing is not supported.
Query Extensions
================
Ancestor Axis
-------------
The ancestor axis can be added to any CPS path query.
**Syntax**: ``//<cps-path>/ancestor::<ancestor-path>``
- ``cps-path``: Any CPS path query.
- ``ancestor-path``: Partial path to ancestors of the target node. This can contain one or more ancestor nodes separated by a /.
**Examples**
- ``//book/ancestor::categories``
- ``//categories[@genre="SciFi"]/book/ancestor::bookstore``
- ``book/ancestor::categories[@code=1]/books``
**Limitations**
- Ancestor list elements can only be addressed using the list key leaf.
- List elements with compound keys are not supported.