From cc1c6b0ab867fc144a92577e31234a8bdf7e0061 Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Mon, 29 Sep 2025 17:14:18 +0200 Subject: [PATCH 1/3] Adding forMode attributes to several TAPRegExt elements. --- Makefile | 2 +- TAPRegExt-v1.1.xsd | 57 +++++++++++++-- TAPRegExt.tex | 179 +++++++++++++++++++++++++++++++++++---------- make-sample.sh | 3 +- sample.xml | 6 ++ 5 files changed, 198 insertions(+), 49 deletions(-) diff --git a/Makefile b/Makefile index e9d7eec..b3ed888 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ ivoatex/Makefile: sample.xml: make-sample.sh - ./make-sample.sh > sample.xml + ./make-sample.sh install: # local to Markus' setup diff --git a/TAPRegExt-v1.1.xsd b/TAPRegExt-v1.1.xsd index 82a5b4f..2fbbe78 100644 --- a/TAPRegExt-v1.1.xsd +++ b/TAPRegExt-v1.1.xsd @@ -4,12 +4,11 @@ xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vr="http://www.ivoa.net/xml/VOResource/v1.0" xmlns:vm="http://www.ivoa.net/xml/VOMetadata/v0.1" xmlns:tr="http://www.ivoa.net/xml/TAPRegExt/v1.0" -version="1.1-pre1" +version="1.1-pre3" targetNamespace="http://www.ivoa.net/xml/TAPRegExt/v1.0" elementFormDefault="unqualified" attributeFormDefault="unqualified" -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelberg.de/docs/schemata/XMLSchema.xsd"> +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> TAPRegExt @@ -22,6 +21,42 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + + + + + This attribute group is intended to be used wherever a TAPRegExt + declaration might depend on the access mode. Currently, only + sync vs. async is supported. + + + + + + This declaration only applies to the named mode. + + + + + + + + This declaration is for synchronous queries. + + + + + + + This declaration is for asynchronous queries. + + + + + + + + @@ -79,7 +114,7 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + minOccurs="0" maxOccurs="unbounded"> Limits on the time between job creation and @@ -89,7 +124,7 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + minOccurs="0" maxOccurs="unbounded"> Limits on executionDuration. @@ -98,7 +133,7 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + minOccurs="0" maxOccurs="unbounded"> Limits on the size of data returned. @@ -107,7 +142,7 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + minOccurs="0" maxOccurs="unbounded"> Limits on the size of uploaded data. @@ -471,6 +506,8 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + + @@ -487,7 +524,6 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber - @@ -517,6 +553,7 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + @@ -547,6 +584,8 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + + @@ -574,6 +613,8 @@ xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://vo.ari.uni-heidelber + + diff --git a/TAPRegExt.tex b/TAPRegExt.tex index e3fef75..1daf800 100644 --- a/TAPRegExt.tex +++ b/TAPRegExt.tex @@ -177,6 +177,31 @@ \subsection{The Schema Namespace and Location} in a TAP server's capabilities endpoint. +\subsection{Mode-dependent Declarations} +\label{sect:modedep} + +Several TAPRegExt elements have a \xmlel{forMode} attribute. This +allows operators to declare different behaviour of their services +depending on the ``mode'' used to access the service, which currently +means choosing between sync and async. For instance, certain output +formats may produce more than one physical file, in which case it would +only be available in async mode. More commonly, services may give async +services much more liberal limits for total execution time or the number +of rows retrievable. + +Elements without a \xmlel{forMode} attribute apply to all modes for +which no more specific specification is given. Elements with a +\xmlel{forMode} attribute override elements without one. That is, to +find the applicable declaration for a particular access mode, clients +should first look for an element with the current access mode and then +for one without \xmlel{forMode}. Whatever is found first is the +relevant declaration. + +This is orthogonal to limits and features that depend on the +authentication status. Services varying these depending on who runs a +query should adjust their capability documents accordingly +(cf.~sect.~\ref{reslimits}). + \subsection{Declaring Instantiated Data Models} \label{dms} @@ -192,8 +217,8 @@ \subsection{Declaring Instantiated Data Models} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DataModelType \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataModelType} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataModelType} Type Schema Documentation} \noindent{\small{}An IVOA defined data model, identified by an IVORN intended for machine consumption and a short label @@ -262,8 +287,8 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd Language \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Language} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Language} Type Schema Documentation} \noindent{\small{}A query language supported by the service.\par} @@ -334,8 +359,8 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd Version \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Version} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Version} Type Schema Documentation} \noindent{\small{}One version of the language supported by the service.\par} @@ -463,8 +488,8 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd LanguageFeatureList \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeatureList} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeatureList} Type Schema Documentation} \noindent{\small{}An enumeration of non-standard or non-mandatory features of a specific type implemented by the language.\par} @@ -534,8 +559,8 @@ \subsection{Languages Supported} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd LanguageFeature \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeature} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:LanguageFeature} Type Schema Documentation} \noindent{\small{}A non-standard or non-mandatory feature implemented by the language..\par} @@ -600,11 +625,15 @@ \subsection{Output Formats} with a BINARY2 child \end{description} +Operators can restrict individual output formats to either sync or async +requests using the \xmlel{forMode} attribute as explained in +\ref{sect:modedep}. + % GENERATED: !schemadoc TAPRegExt-v1.1.xsd OutputFormat \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:OutputFormat} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:OutputFormat} Type Schema Documentation} \noindent{\small{}An output format supported by the service.\par} @@ -650,6 +679,17 @@ \subsection{Output Formats} resource record and look for keys starting with {"}output-{"}. \end{description} +\item[forMode] +\begin{description} +\item[Type] string +\item[Meaning] This declaration only applies to the named mode. +\item[Occurrence] optional + +\item[Allowed Values\vrule width 0pt depth 5pt]\hfil + \begin{longtermsdescription}\item[sync]This declaration is for synchronous queries. +\item[async]This declaration is for asynchronous queries. +\end{longtermsdescription} +\end{description} \end{bigdescription}\endgroup @@ -733,11 +773,15 @@ \subsection{Upload Methods} \end{lstlisting} +Operators can restrict individual upload methods to either sync or async +requests using the \xmlel{forMode} attribute as explained in +\ref{sect:modedep}. + % GENERATED: !schemadoc TAPRegExt-v1.1.xsd UploadMethod \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:UploadMethod} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:UploadMethod} Type Schema Documentation} \noindent{\small{}An upload method as defined by IVOA.\par} @@ -758,6 +802,7 @@ \subsection{Upload Methods} + @@ -773,6 +818,17 @@ \subsection{Upload Methods} \item[Occurrence] optional \end{description} +\item[forMode] +\begin{description} +\item[Type] string +\item[Meaning] This declaration only applies to the named mode. +\item[Occurrence] optional + +\item[Allowed Values\vrule width 0pt depth 5pt]\hfil + \begin{longtermsdescription}\item[sync]This declaration is for synchronous queries. +\item[async]This declaration is for asynchronous queries. +\end{longtermsdescription} +\end{description} \end{bigdescription}\endgroup @@ -799,6 +855,12 @@ \subsection{Resource Limits} conservative guidelines. Thus, the operators of a service implementing a complex, possibly dynamic limits policy should give lower estimates here. +It is rather common that operators enforce different limits depending on +the access mode (sync or async). Therefore, most limits have a +\xmlel{forMode} attribute as per sect.~\ref{sect:modedep}; for +convenience and later extensibiilty, that is even true for +\xmlel{retentionPeriod}, which admittedly cannot apply to sync requests. + If a service supports authentication and has different limits depending on what user is authenticated, it should make an effort to guess the limits applying to a given client (e.g., when @@ -834,8 +896,8 @@ \subsubsection{Limits on Time} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd TimeLimits \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TimeLimits} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TimeLimits} Type Schema Documentation} \noindent{\small{}Time-valued limits, all values given in seconds.\par} @@ -848,9 +910,28 @@ \subsubsection{Limits on Time} maxOccurs="1" /> + \end{lstlisting} +\vspace{0.5ex}\noindent\textbf{\xmlel{tr:TimeLimits} Attributes} + +\begingroup\small\begin{bigdescription}\item[forMode] +\begin{description} +\item[Type] string +\item[Meaning] This declaration only applies to the named mode. +\item[Occurrence] optional + +\item[Allowed Values\vrule width 0pt depth 5pt]\hfil + \begin{longtermsdescription}\item[sync]This declaration is for synchronous queries. +\item[async]This declaration is for asynchronous queries. +\end{longtermsdescription} +\end{description} + +\end{bigdescription}\endgroup + + + \vspace{0.5ex}\noindent\textbf{\xmlel{tr:TimeLimits} Metadata Elements} \begingroup\small\begin{bigdescription}\item[Element \xmlel{default}] @@ -907,8 +988,8 @@ \subsubsection{Limits on Data} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DataLimits \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimits} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimits} Type Schema Documentation} \noindent{\small{}Limits on data sizes, given in rows or bytes.\par} @@ -922,9 +1003,28 @@ \subsubsection{Limits on Data} + \end{lstlisting} +\vspace{0.5ex}\noindent\textbf{\xmlel{tr:DataLimits} Attributes} + +\begingroup\small\begin{bigdescription}\item[forMode] +\begin{description} +\item[Type] string +\item[Meaning] This declaration only applies to the named mode. +\item[Occurrence] optional + +\item[Allowed Values\vrule width 0pt depth 5pt]\hfil + \begin{longtermsdescription}\item[sync]This declaration is for synchronous queries. +\item[async]This declaration is for asynchronous queries. +\end{longtermsdescription} +\end{description} + +\end{bigdescription}\endgroup + + + \vspace{0.5ex}\noindent\textbf{\xmlel{tr:DataLimits} Metadata Elements} \begingroup\small\begin{bigdescription}\item[Element \xmlel{default}] @@ -953,8 +1053,8 @@ \subsubsection{Limits on Data} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DataLimit \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimit} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DataLimit} Type Schema Documentation} \noindent{\small{}A limit on some data size, either in rows or in bytes.\par} @@ -986,8 +1086,8 @@ \subsubsection{Limits on Data} \item[Meaning] The unit of the limit specified. \item[Occurrence] required -\item[Allowed Values]\hfil -\begin{longtermsdescription}\item[byte] +\item[Allowed Values\vrule width 0pt depth 5pt]\hfil + \begin{longtermsdescription}\item[byte] \item[row] \end{longtermsdescription} \end{description} @@ -1036,8 +1136,8 @@ \subsection{Interface Declaration} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd DALIInterface \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DALIInterface} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:DALIInterface} Type Schema Documentation} \noindent{\small{}An interface for a complex, multi-endpoint interfaces as regulated by DALI.\par} @@ -1091,8 +1191,8 @@ \subsection{Interface Declaration} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd Endpoint \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Endpoint} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:Endpoint} Type Schema Documentation} \noindent{\small{}An endpoint of a complex interface.\par} @@ -1160,8 +1260,8 @@ \subsection{Interface Declaration} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd MetaTriple \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:MetaTriple} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:MetaTriple} Type Schema Documentation} \noindent{\small{}A container for an RDFa triple giving information related to an endpoint.\par} @@ -1310,8 +1410,8 @@ \subsection{The Capability Record} % GENERATED: !schemadoc TAPRegExt-v1.1.xsd TableAccess \begin{generated} \begingroup - \renewcommand*\descriptionlabel[1]{% - \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TableAccess} Type Schema Documentation} + \renewcommand*\descriptionlabel[1]{% + \hbox to 5.5em{\emph{#1}\hfil}}\vspace{2ex}\noindent\textbf{\xmlel{tr:TableAccess} Type Schema Documentation} \noindent{\small{}The capabilities of a TAP server.\par} @@ -1334,14 +1434,14 @@ \subsection{The Capability Record} + maxOccurs="unbounded" /> + maxOccurs="unbounded" /> + maxOccurs="unbounded" /> + maxOccurs="unbounded" /> @@ -1387,28 +1487,28 @@ \subsection{The Capability Record} \item[Type] composite: \xmlel{tr:TimeLimits} \item[Meaning] Limits on the time between job creation and destruction time. -\item[Occurrence] optional +\item[Occurrence] optional; multiple occurrences allowed. \end{description} \item[Element \xmlel{executionDuration}] \begin{description} \item[Type] composite: \xmlel{tr:TimeLimits} \item[Meaning] Limits on executionDuration. -\item[Occurrence] optional +\item[Occurrence] optional; multiple occurrences allowed. \end{description} \item[Element \xmlel{outputLimit}] \begin{description} \item[Type] composite: \xmlel{tr:DataLimits} \item[Meaning] Limits on the size of data returned. -\item[Occurrence] optional +\item[Occurrence] optional; multiple occurrences allowed. \end{description} \item[Element \xmlel{uploadLimit}] \begin{description} \item[Type] composite: \xmlel{tr:DataLimits} \item[Meaning] Limits on the size of uploaded data. -\item[Occurrence] optional +\item[Occurrence] optional; multiple occurrences allowed. \end{description} @@ -1446,6 +1546,9 @@ \subsection{Changes from REC-1.0} \begin{itemize} \item Adding tr:DALIInterface to the schema. +\item Allowing a forMode attribute on outputFormat, uploadMethod, +retentionPeriod, executionDuration, outputLimit, and uploadLimit; to +make that work, allowing more than one of the limit elements now. \item Dropping the appendix with an example document. Using a standalone, validated file and auxiliaryurl instead. \end{itemize} diff --git a/make-sample.sh b/make-sample.sh index df2225b..a7b1e5e 100755 --- a/make-sample.sh +++ b/make-sample.sh @@ -8,9 +8,8 @@ curl -s http://localhost:8080/tap/capabilities \ | xmlstarlet ed \ -d "//capability[not(contains(@standardID, 'capabilities') or contains(@standardID, 'TAP'))]" \ - | xmlstarlet fo -o -s 2 + | xmlstarlet fo -o -s 2 > sample.xml -exit 0 STILTS=stilts SCHEMA_FILE=TAPRegExt-v1.1.xsd $STILTS xsdvalidate \ diff --git a/sample.xml b/sample.xml index cb884ba..2be6cb5 100644 --- a/sample.xml +++ b/sample.xml @@ -476,6 +476,9 @@ of the timestamp. 172800 + 50 + + 7200 @@ -483,6 +486,9 @@ of the timestamp. 20000000 + 10000000 + + 80000000 From 551c9e84522d6c60297c5873f637d753de5ef84e Mon Sep 17 00:00:00 2001 From: Mark Taylor Date: Wed, 1 Oct 2025 10:55:17 +0100 Subject: [PATCH 2/3] Tiny spelling and whitespace fixes --- TAPRegExt-v1.1.xsd | 2 +- TAPRegExt.tex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/TAPRegExt-v1.1.xsd b/TAPRegExt-v1.1.xsd index 2fbbe78..8c191b7 100644 --- a/TAPRegExt-v1.1.xsd +++ b/TAPRegExt-v1.1.xsd @@ -553,7 +553,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - + diff --git a/TAPRegExt.tex b/TAPRegExt.tex index 1daf800..91be0d5 100644 --- a/TAPRegExt.tex +++ b/TAPRegExt.tex @@ -858,7 +858,7 @@ \subsection{Resource Limits} It is rather common that operators enforce different limits depending on the access mode (sync or async). Therefore, most limits have a \xmlel{forMode} attribute as per sect.~\ref{sect:modedep}; for -convenience and later extensibiilty, that is even true for +convenience and later extensibility, that is even true for \xmlel{retentionPeriod}, which admittedly cannot apply to sync requests. If a service supports authentication and has different From 70bcf36bbef7cf72678963c44db21940a273d19a Mon Sep 17 00:00:00 2001 From: Markus Demleitner Date: Thu, 2 Oct 2025 12:35:31 +0200 Subject: [PATCH 3/3] Attempting a clarification on repeated mode-dependent declarations. --- TAPRegExt.tex | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/TAPRegExt.tex b/TAPRegExt.tex index 1daf800..f3ddc41 100644 --- a/TAPRegExt.tex +++ b/TAPRegExt.tex @@ -189,13 +189,25 @@ \subsection{Mode-dependent Declarations} services much more liberal limits for total execution time or the number of rows retrievable. -Elements without a \xmlel{forMode} attribute apply to all modes for -which no more specific specification is given. Elements with a -\xmlel{forMode} attribute override elements without one. That is, to -find the applicable declaration for a particular access mode, clients -should first look for an element with the current access mode and then -for one without \xmlel{forMode}. Whatever is found first is the -relevant declaration. +Elements without a \xmlel{forMode} attribute apply to all modes. The +semantics of non-empty \xmlel{forMode} attributes depends on what +elements they are on: + +\begin{itemize} +\item For \xmlel{outputFormat} and \xmlel{uploadMethod}, specifications +are accumulative (i.e., you cannot retract formats or methods per mode, +just add to them). + +\item For \xmlel{retentionPeriod}, \xmlel{executionDuration}, +\xmlel{outputLimit}, and \xmlel{uploadLimit}, limits given in elements +with a \xmlel{forMode} attribute override limits given in elements +without one for the mode specified. For these elements, only zero or +one occurrences are allowed each without \xmlel{forMode} and per +\xmlel{forMode} value\footnote{This constraint is hard to express in XML +Schema and is thus not enforced by it; its purpose is to make sure that +clients will find unique limits.}. + +\end{itemize} This is orthogonal to limits and features that depend on the authentication status. Services varying these depending on who runs a