SmartTokenLabs/TokenScript

add various restricctions to `distinct`

SmartLayer opened this issue · 8 comments

For a top-level <token> element, there can be many <attribute>. Current schema (in the distinct branch) allows any number of elements to have a boolean attribute distinct which defaults to false,

If it is set to true, we say that the attribute is distinct.

That means potentially developers can create a tokenscript file with multiple distinct attributes, which is not supported (at least not in this year)

Can you

  1. restrain it so that for all <attribute> under the <token> only one can have the attribute distinct with value true.

  2. for a TokenScript that didn't define <origins> under <token>,, require at least one of the <attribute> has distinct?

  3. distinct attribute is not allowed for attributes in <card>, only if it is directly in <token> (the global element <token>).

Once you have it, you can make PR from distinct branch to master.

I have investigated this and is very much possible to implement but not with XSD 1.0. We need to switch to XSD 1.1 and make use xsd:assert/ element to achieve all three requirements.

Right now it is not clear how we can switch to XSD 1.1. Just mentioning it <schema version="1.1" does not make the difference, we need to change the XSD processor setting to consider XSD version as 1.1.

From validate.sh file it is not clear which XSD processor we are using and whether it supports the XSD 1.1. Do you have any information so that I can move ahead?

XSD 1.1 is currently supported by Saxon and by Xerces J.
Reference - https://stackoverflow.com/questions/18782706/linux-command-line-tool-validating-xsd-1-1
constraints - https://www.xml.com/articles/2018/05/29/co-occurrence-cta-xsd/

Happy to change to XSD 1.1 and I believe we just need to change the schema version because I had the impression ./validate.sh (which actually uses a Makefile) already use an 1.1 procesor. Try it.

After checking more on it found that we have - TokenScript-Examples/examples/2020-06.mk which decides the tool used for validating XML.

I have XMLLINT installed which is used for validating and that does not support XSD version 1.1.

Other tools here are XMLSECTOOL and XMLSEC, Need to check if those supports XSD 1.1? And if yes need to install on my machine.

2020-06.mk

ifeq ($(XMLSECTOOL),)
XMLSECTOOL=xmlsectool
endif

ifeq ($(XMLLINT),)
XMLLINT=xmllint
endif

ifeq ($(XMLSEC),)
XMLSEC=xmlsec1 # xmlsec for Linux/Windows
endif
  1. restrain it so that for all <attribute> under the <token> only one can have the attribute distinct with value true.
  2. for a TokenScript that didn't define <origins> under <token>,, require at least one of the <attribute> has distinct?
  3. distinct attribute is not allowed for attributes in <card>, only if it is directly in <token> (the global element <token>).

Item three from the list is completed and pushed to branch. This is the change link - c4ca79f

Now about action items 1 and 2 I have implemented simple working Java class to validate the XML using XSD 1.1. This Java code is based on xercesImpl.jar, attached with this update named XSDValidator.txt.

I have investigated and tried many versions of the XPath using XSD 1.1 but still did not get the perfect solution due to limited features of XSD 1.1. Will give one more try to find out the solution.
XSDValidator.txt

Other Details:
XSD 1.0 stable compatible change - c4ca79f
All changes resolving all mentioned issues - 73020c6

Created PR - #388

I'll close this issue when the tool mentioned in #395 is made that can do both validation and canonicalisation following the commandline syntax required there, and when you start a new PR which uncommented the two lines of code that uses schema 1.1