Skip to content

Commit 66e73d8

Browse files
committed
introduce package for URI templates with path parameters, related to #2
1 parent 11a6bd6 commit 66e73d8

File tree

4 files changed

+165
-0
lines changed

4 files changed

+165
-0
lines changed

build.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
<antcall target="test-test-post-proc-fun.xsl"/>
2727
<antcall target="test-test-post-proc-call.xsl"/>
2828
<antcall target="test-xsl-uri-templates-query-parameters.xsl"/>
29+
<antcall target="test-xsl-uri-templates-path-parameters.xsl"/>
2930
</target>
3031

3132
<target name="test-xsl-dts.xsl">
@@ -70,5 +71,10 @@
7071
</antcall>
7172
</target>
7273

74+
<target name="test-xsl-uri-templates-path-parameters.xsl">
75+
<antcall target="xspec.xspec" inheritall="false">
76+
<param name="xspec.xml" location="${basedir}/xsl/uri-templates/path-parameters.xspec"/>
77+
</antcall>
78+
</target>
7379

7480
</project>

saxon-local.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ http://www.saxonica.com/documentation/index/configuration-file.html
2929
<package
3030
name="https://scdh.github.io/dts-transformations/xsl/uri-templates/query-parameters.xsl"
3131
version="1.0.0" sourceLocation="xsl/uri-templates/query-parameters.xsl"/>
32+
<package
33+
name="https://scdh.github.io/dts-transformations/xsl/uri-templates/path-parameters.xsl"
34+
version="1.0.0" sourceLocation="xsl/uri-templates/path-parameters.xsl"/>
3235
</xsltPackages>
3336

3437
</configuration>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<!-- An implementation of the required uri-templates following the all-query-parameters pattern
2+
3+
-->
4+
<xsl:package name="https://scdh.github.io/dts-transformations/xsl/uri-templates/path-parameters.xsl"
5+
package-version="1.0.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
6+
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:map="http://www.w3.org/2005/xpath-functions/map"
7+
xmlns:dts="https://distributed-text-services.github.io/specifications/"
8+
exclude-result-prefixes="#all" xpath-default-namespace="http://www.tei-c.org/ns/1.0" version="3.0">
9+
10+
<xsl:use-package name="https://scdh.github.io/dts-transformations/xsl/uri-templates/base.xsl"
11+
package-version="1.0.0">
12+
<xsl:accept component="function" names="dts:*" visibility="public"/>
13+
<xsl:override>
14+
15+
<xsl:function name="dts:navigation-uri" as="xs:anyURI?" visibility="public">
16+
<xsl:param name="resource" as="document-node()"/>
17+
<xsl:param name="parameters" as="map(xs:string, item()*)"/>
18+
<xsl:sequence
19+
select="($api-base-uri || $navigation-path || (map:get($parameters, 'resource') => $encode()) || '/' || dts:path-parameters($parameters, ('ref', 'down', 'start', 'end', 'tree', 'page'))) => xs:anyURI()"
20+
/>
21+
</xsl:function>
22+
23+
<xsl:function name="dts:collection-uri-template-on-resource" as="xs:anyURI?"
24+
visibility="public">
25+
<xsl:param name="resource" as="document-node()"/>
26+
<xsl:param name="parameters" as="map(xs:string, item()*)"/>
27+
<xsl:sequence
28+
select="($api-base-uri || $collection-path || (map:get($parameters, 'resource') => $encode()) || '/{page,nav}') => xs:anyURI()"
29+
/>
30+
</xsl:function>
31+
32+
<xsl:function name="dts:navigation-uri-template-on-resource" as="xs:anyURI?"
33+
visibility="public">
34+
<xsl:param name="resource" as="document-node()"/>
35+
<xsl:param name="parameters" as="map(xs:string, item()*)"/>
36+
<xsl:sequence
37+
select="($api-base-uri || $navigation-path || (map:get($parameters, 'resource') => $encode()) || '/{ref,down,start,end,tree,page}') => xs:anyURI()"
38+
/>
39+
</xsl:function>
40+
41+
<xsl:function name="dts:document-uri-template-on-resource" as="xs:anyURI?" visibility="public">
42+
<xsl:param name="resource" as="document-node()"/>
43+
<xsl:param name="parameters" as="map(xs:string, item()*)"/>
44+
<xsl:sequence
45+
select="($api-base-uri || $document-path || (map:get($parameters, 'resource') => $encode()) || '/{ref,start,end,tree,mediaType}') => xs:anyURI()"
46+
/>
47+
</xsl:function>
48+
49+
</xsl:override>
50+
</xsl:use-package>
51+
52+
<xsl:function name="dts:path-parameters" as="xs:string" visibility="private">
53+
<xsl:param name="parameters" as="map(xs:string, item()*)"/>
54+
<xsl:param name="order" as="xs:string+"/>
55+
<xsl:sequence select="($order ! map:get($parameters, .) ! $encode(.)) => string-join('/')"/>
56+
</xsl:function>
57+
58+
</xsl:package>
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<x:description xmlns:x="http://www.jenitennison.com/xslt/xspec"
3+
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
4+
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
5+
xmlns:xs="http://www.w3.org/2001/XMLSchema"
6+
xmlns:dts="https://distributed-text-services.github.io/specifications/"
7+
xmlns:t="http://www.tei-c.org/ns/1.0" stylesheet="path-parameters.xsl" run-as="external">
8+
9+
<x:variable name="x:saxon-config" href="../../test/saxon.xml"/>
10+
11+
<x:param name="encode" select="encode-for-uri#1"/>
12+
13+
<x:scenario label="navigation uri; empty parameters map">
14+
<x:call function="dts:navigation-uri">
15+
<x:param name="resource" href="../../test/matt.xml"/>
16+
<x:param name="parameters" select="map { }"/>
17+
</x:call>
18+
<x:expect label="result"
19+
select="matches($x:result, '^https://example.org/api/dts/navigation/+')" pending="todo"
20+
/>
21+
</x:scenario>
22+
23+
<x:scenario label="navigation uri; silly parameters map">
24+
<x:call function="dts:navigation-uri">
25+
<x:param name="resource" href="../../test/matt.xml"/>
26+
<x:param name="parameters" select="map { 'tree': 'av', 'c': 'cv'}"/>
27+
</x:call>
28+
<x:expect label="result" select="xs:anyURI('https://example.org/api/dts/navigation//av')"/>
29+
</x:scenario>
30+
31+
<x:scenario label="navigation uri; silly parameters map, reversed order">
32+
<x:call function="dts:navigation-uri">
33+
<x:param name="resource" href="../../test/matt.xml"/>
34+
<x:param name="parameters" select="map { 'c': 'cv', 'tree': 'av' }"/>
35+
</x:call>
36+
<x:expect label="result" select="xs:anyURI('https://example.org/api/dts/navigation//av')"/>
37+
</x:scenario>
38+
39+
<x:scenario label="navigation uri template; silly parameters">
40+
<x:call function="dts:navigation-uri-template-on-resource">
41+
<x:param name="resource" href="../../test/matt.xml"/>
42+
<x:param name="parameters" select="map { 'c': 'cv', 'a': 'av' }"/>
43+
</x:call>
44+
<x:expect label="result"
45+
select="xs:anyURI('https://example.org/api/dts/navigation//{ref,down,start,end,tree,page}')"
46+
/>
47+
</x:scenario>
48+
49+
<x:scenario label="navigation uri template; silly parameters and resource">
50+
<x:call function="dts:navigation-uri-template-on-resource">
51+
<x:param name="resource" href="../../test/matt.xml"/>
52+
<x:param name="parameters"
53+
select="map { 'c': 'cv', 'a': 'av', 'resource': 'http://abgedre.ht/zuckt' }"/>
54+
</x:call>
55+
<x:expect label="result"
56+
select="xs:anyURI('https://example.org/api/dts/navigation/http%3A%2F%2Fabgedre.ht%2Fzuckt/{ref,down,start,end,tree,page}')"
57+
/>
58+
</x:scenario>
59+
60+
<x:scenario label="collection uri template; silly parameters and resource">
61+
<x:call function="dts:collection-uri-template-on-resource">
62+
<x:param name="resource" href="../../test/matt.xml"/>
63+
<x:param name="parameters"
64+
select="map { 'c': 'cv', 'a': 'av', 'resource': 'http://abgedre.ht/zuckt' }"/>
65+
</x:call>
66+
<x:expect label="result"
67+
select="xs:anyURI('https://example.org/api/dts/collection/http%3A%2F%2Fabgedre.ht%2Fzuckt/{page,nav}')"
68+
/>
69+
</x:scenario>
70+
71+
<x:scenario label="document uri template; silly parameters and resource">
72+
<x:call function="dts:document-uri-template-on-resource">
73+
<x:param name="resource" href="../../test/matt.xml"/>
74+
<x:param name="parameters"
75+
select="map { 'c': 'cv', 'a': 'av', 'resource': 'http://abgedre.ht/zuckt' }"/>
76+
</x:call>
77+
<x:expect label="result"
78+
select="xs:anyURI('https://example.org/api/dts/document/http%3A%2F%2Fabgedre.ht%2Fzuckt/{ref,start,end,tree,mediaType}')"
79+
/>
80+
</x:scenario>
81+
82+
<x:scenario label="templates for navigation entpoint">
83+
<x:call function="dts:uri-template-map-entries">
84+
<x:param name="resource" href="../../test/matt.xml"/>
85+
<x:param name="parameters"
86+
select="map { 'c': 'cv', 'a': 'av', 'resource': 'http://abgedre.ht/zuckt' }"/>
87+
</x:call>
88+
<x:expect label="has collection uri template"
89+
test="$x:result[map:contains(., 'collection')] => exists()"/>
90+
<x:expect label="has document uri template"
91+
test="$x:result[map:contains(., 'document')] => exists()"/>
92+
<x:expect label="has navigation uri template"
93+
test="$x:result[map:contains(., 'navigation')] => exists()"/>
94+
<x:expect label="does not have unknown uri template"
95+
test="$x:result[map:contains(., 'unknown')] => exists() => not()"/>
96+
</x:scenario>
97+
98+
</x:description>

0 commit comments

Comments
 (0)