From 407717d4b55db7361deb02785088d894d1501dcc Mon Sep 17 00:00:00 2001 From: Arno Kaimbacher Date: Mon, 7 Nov 2022 13:55:02 +0100 Subject: [PATCH] - first commit --- .babelrc | 29 + .env.example | 10 + .eslintrc.js | 43 ++ .gitignore | 73 +++ .prettierrc | 9 + .vscode/launch.json | 45 ++ .vscode/settings.json | 5 + .vscode/tasks.json | 18 + LICENSE | 22 + app.js | 2 + client/book-list.html | 83 +++ client/book-list.js | 70 +++ datasetxml2oai-pmh.xslt | 613 ++++++++++++++++++++ db.config.js | 80 +++ new-book.html | 55 ++ notes.txt | 95 +++ package.json | 70 +++ prefixes/oai2_style.xslt | 655 +++++++++++++++++++++ prefixes/oai_datacite.xslt | 426 ++++++++++++++ readme.md | 17 + src/app.ts | 76 +++ src/config/db.config.ts | 60 ++ src/config/oai.config.ts | 12 + src/controllers/dataset.controller.ts | 160 +++++ src/controllers/datasetxml2oai.sef.json | 1 + src/controllers/home.controller.js | 77 +++ src/controllers/oai.controller.ts | 738 ++++++++++++++++++++++++ src/exceptions/BadRequest.ts | 11 + src/exceptions/HttpException.ts | 12 + src/exceptions/InternalServerError.ts | 11 + src/exceptions/OaiErrorCodes.ts | 11 + src/exceptions/OaiModelException.ts | 77 +++ src/exceptions/PageNotFoundException.ts | 11 + src/exceptions/error-handler.ts | 23 + src/library/XmlModel.ts | 184 ++++++ src/library/oai/OaiConfiguration.ts | 71 +++ src/library/oai/ResumptionToken.ts | 107 ++++ src/library/oai/TokenWorker.ts | 194 +++++++ src/models/Dataset.ts | 155 +++++ src/models/DocumentXmlCache.ts | 167 ++++++ src/models/Identifier.ts | 43 ++ src/models/Person.ts | 64 ++ src/models/Project.ts | 41 ++ src/models/abstract.model.js | 32 + src/models/coverage.model.js | 34 ++ src/models/dataset.model.js | 49 ++ src/models/file.model.js | 44 ++ src/models/init-models.js | 210 +++++++ src/models/license.model.js | 51 ++ src/models/person.model.js | 20 + src/models/subject.model.js | 33 ++ src/models/title.model.js | 26 + src/models/user.model.js | 39 ++ src/routes/dataset.routes.js | 38 ++ src/routes/home.routes.js | 12 + src/server.ts | 158 +++++ tsconfig.json | 38 ++ 57 files changed, 5510 insertions(+) create mode 100644 .babelrc create mode 100644 .env.example create mode 100644 .eslintrc.js create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 LICENSE create mode 100644 app.js create mode 100644 client/book-list.html create mode 100644 client/book-list.js create mode 100755 datasetxml2oai-pmh.xslt create mode 100644 db.config.js create mode 100644 new-book.html create mode 100644 notes.txt create mode 100644 package.json create mode 100755 prefixes/oai2_style.xslt create mode 100755 prefixes/oai_datacite.xslt create mode 100644 readme.md create mode 100644 src/app.ts create mode 100644 src/config/db.config.ts create mode 100644 src/config/oai.config.ts create mode 100644 src/controllers/dataset.controller.ts create mode 100644 src/controllers/datasetxml2oai.sef.json create mode 100644 src/controllers/home.controller.js create mode 100644 src/controllers/oai.controller.ts create mode 100644 src/exceptions/BadRequest.ts create mode 100644 src/exceptions/HttpException.ts create mode 100644 src/exceptions/InternalServerError.ts create mode 100644 src/exceptions/OaiErrorCodes.ts create mode 100644 src/exceptions/OaiModelException.ts create mode 100644 src/exceptions/PageNotFoundException.ts create mode 100644 src/exceptions/error-handler.ts create mode 100644 src/library/XmlModel.ts create mode 100644 src/library/oai/OaiConfiguration.ts create mode 100644 src/library/oai/ResumptionToken.ts create mode 100644 src/library/oai/TokenWorker.ts create mode 100644 src/models/Dataset.ts create mode 100644 src/models/DocumentXmlCache.ts create mode 100644 src/models/Identifier.ts create mode 100644 src/models/Person.ts create mode 100644 src/models/Project.ts create mode 100644 src/models/abstract.model.js create mode 100644 src/models/coverage.model.js create mode 100644 src/models/dataset.model.js create mode 100644 src/models/file.model.js create mode 100644 src/models/init-models.js create mode 100644 src/models/license.model.js create mode 100644 src/models/person.model.js create mode 100644 src/models/subject.model.js create mode 100644 src/models/title.model.js create mode 100644 src/models/user.model.js create mode 100644 src/routes/dataset.routes.js create mode 100644 src/routes/home.routes.js create mode 100644 src/server.ts create mode 100644 tsconfig.json diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..6719f5f --- /dev/null +++ b/.babelrc @@ -0,0 +1,29 @@ +{ + "presets": [ + + [ + "@babel/preset-env", + { + "targets":{"node":"16"} + // "useBuiltIns": "entry", + // "targets": "> 0.25%, not dead" + } + ], + // "@babel/preset-env", + "@babel/preset-typescript" + ], + "plugins": [ + [ + "@babel/plugin-transform-typescript", { + "allowDeclareFields": true + }], + ["@babel/plugin-proposal-decorators", { + "legacy": true + }], + + + "@babel/proposal-class-properties", + "@babel/proposal-object-rest-spread" + ] +} + diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..110c9f9 --- /dev/null +++ b/.env.example @@ -0,0 +1,10 @@ +DB_SCHEMA=public +DB_NAME=tethys_db +DB_USER=your_db_user +DB_PASSWORD=your_password +DB_HOST=localhost +DB_PORT=5432 +DB_DRIVER=postgres + + +BASE_DOMAIN=https://tethys.at \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..7db54ac --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,43 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint", "prettier"], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + // // 'prettier/@typescript-eslint', + // Then you need to add plugin:prettier/recommended as the last extension in your .eslintrc.json: + // 'prettier/@typescript-eslint', + "plugin:prettier/recommended", + ], + parserOptions: { + ecmaVersion: 2020, + sourceType: "module", + }, + env: { + es6: true, + node: true, + }, + + // "off" means 0 (turns the rule off completely) + // "warn" means 1 (turns the rule on but won't make the linter fail) + // "error" means 2 (turns the rule on and will make the linter fail) + rules: { + // "prettier/prettier": ["error", { "singleQuote": true }], + "no-console": 0, // Remember, this means error!, + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/ban-ts-comment": "warn", + "no-var": "error", + semi: "error", + // indent: ['error', 4, { SwitchCase: 1 }], + "no-multi-spaces": "error", + "space-in-parens": "error", + "no-multiple-empty-lines": "error", + "prefer-const": "error", + "@typescript-eslint/indent": ["error", 4], + "prettier/prettier": ["error", { singleQuote: false }], + + // "arrow-body-style": "off", + // "prefer-arrow-callback": "off" + }, +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d63d931 --- /dev/null +++ b/.gitignore @@ -0,0 +1,73 @@ +# Node modules +node_modules +package-lock.json +jspm_packages/ + + +# Linux +*~ +*.swp + +# Windows +Thumbs.db +desktop.ini + +/.idea +# /.vscode +/.vs +/.vagrant +Homestead.json +Homestead.yaml + + + +yarn-error.log +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Environment variables, never commit this file +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# VSCode & Webstorm history directories +.history +.idea + +# Adonis directory for storing tmp files +tmp +.temp +.cache + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# TypeScript cache +*.tsbuildinfo + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Output of 'npm pack' +*.tgz + +# Nuxt.js build / generate output +.nuxt +dist + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7d4e9dc --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "trailingComma": "all", + "tabWidth": 4, + "semi": true, + "singleQuote": false, + "arrowParens": "always", + "proseWrap": "preserve", + "printWidth": 140 +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..e81fcb4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,45 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "launch nodemon via bable-node", + "runtimeExecutable": "${workspaceFolder}/node_modules/nodemon/bin/nodemon.js", + "runtimeArgs": [ + "--exec", "babel-node", + "--nolazy", + "--extensions", "\".ts,.tsx,.js\"" + // "--require", + // "babel-register" + ], + "env": { + "NODE_ENV": "development" + }, + "program": "${workspaceFolder}/src/server.ts", + "restart": true, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + // { + // "type": "chrome", + // "request": "launch", + // "name": "Launch Edge against localhost", + // "url": "http://localhost:3000", + // "webRoot": "${workspaceFolder}" + // }, + { + "type": "node", + "args": ["--trace-deprecation"], + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/server.js" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1d6ab3b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "prettier.configPath": ".prettierrc", + "prettier.bracketSameLine": true +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..d0ea1f7 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,18 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "xslt-js", + "label": "xslt-js: Saxon-JS Transform (New)", + "xsltFile": "${file}", + "xmlSource": "${file}", + "resultPath": "${workspaceFolder}/xslt-out/result1.xml", + "group": { + "kind": "build" + }, + "problemMatcher": [ + "$saxon-xslt-js" + ] + } + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a8ae80b --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +MIT License +----------- + +Copyright (c) 2022, Geologische Bundesanstalt (GBA) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..65382c0 --- /dev/null +++ b/app.js @@ -0,0 +1,2 @@ +var msg = "Hello World"; +console.log(msg); \ No newline at end of file diff --git a/client/book-list.html b/client/book-list.html new file mode 100644 index 0000000..f396250 --- /dev/null +++ b/client/book-list.html @@ -0,0 +1,83 @@ + + + + + + + + Document + + + + + +
+
+

List of books

+
+ +
+
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/client/book-list.js b/client/book-list.js new file mode 100644 index 0000000..77a352c --- /dev/null +++ b/client/book-list.js @@ -0,0 +1,70 @@ +const setEditModal = (isbn) => { + const xhttp = new XMLHttpRequest(); + + xhttp.open("GET", `http://localhost:3000/book/${isbn}`, false); + xhttp.send(); + + const book = JSON.parse(xhttp.responseText); + + const { + title, + author, + publisher, + publish_date, + numOfPages + } = book; + + document.getElementById('isbn').value = isbn; + document.getElementById('title').value = title; + document.getElementById('author').value = author; + document.getElementById('publisher').value = publisher; + document.getElementById('publish_date').value = publish_date; + document.getElementById('numOfPages').value = numOfPages; + + // setting up the action url for the book + document.getElementById('editForm').action = `http://localhost:3000/book/${isbn}`; +} + +const deleteBook = (isbn) => { + const xhttp = new XMLHttpRequest(); + + xhttp.open("DELETE", `http://localhost:3000/book/${isbn}`, false); + xhttp.send(); + + location.reload(); +} + +const loadBooks = () => { + const xhttp = new XMLHttpRequest(); + + xhttp.open("GET", "http://localhost:3000/books", false); + xhttp.send(); + + const books = JSON.parse(xhttp.responseText); + + for (let book of books) { + const x = ` +
+
+
+
${book.title}
+
${book.isbn}
+
Author: ${book.author}
+
Publisher: ${book.publisher}
+
Number Of Pages: ${book.numOfPages}
+
+ + +
+
+
+ ` + + document.getElementById('books').innerHTML += x; + } +} + +loadBooks(); diff --git a/datasetxml2oai-pmh.xslt b/datasetxml2oai-pmh.xslt new file mode 100755 index 0000000..0f2eb97 --- /dev/null +++ b/datasetxml2oai-pmh.xslt @@ -0,0 +1,613 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type="text/xsl" href="../prefixes/oai2_style.xslt" title="Defaultstyle" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.0 + + + + + + + + + persistent + + + YYYY-MM-DDThh:mm:ssZ + + + + + oai + + + + + + : + + + + + + + + + + + + + + + + oai_dc + + + http://www.openarchives.org/OAI/2.0/oai_dc.xsd + + + http://www.openarchives.org/OAI/2.0/oai_dc/ + + + + + oai_datacite + + + http://schema.datacite.org/meta/kernel-4.3/metadata.xsd + + + http://datacite.org/schema/kernel-4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + deleted + + + + oai: + + : + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dataset + + + + + + + + + + + + + + + + + + + + + + embargo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , + + + + ( + + ) + + + + + + + + + , + + + + ( + + ) + + + + + + + + + + + + + + + + + + + + + + + info:eu-repo/date/embargoEnd/ + + - + + - + + + + + + + + + + + + + + application/geopackage+sqlite3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + info:eu-repo/semantics/openAccess + + + + +
\ No newline at end of file diff --git a/db.config.js b/db.config.js new file mode 100644 index 0000000..58f2943 --- /dev/null +++ b/db.config.js @@ -0,0 +1,80 @@ +import Sequelize from "sequelize"; +import * as dotenv from "dotenv"; // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import +dotenv.config(); + +// module.exports = { +// HOST: "localhost", +// USER: "tethys_admin", +// PASSWORD: "tethys_admin007", +// DB: "tethys", +// dialect: "postgres", +// pool: { +// max: 5, +// min: 0, +// acquire: 30000, +// idle: 10000 +// } +// }; + +// const pg = require('pg'); +// pg.types.setTypeParser(1114, (str) => new Date((str.split(' ').join('T'))+'Z')); + + +const dbSchema = process.env.DB_SCHEMA; +const dbName = process.env.DB_NAME; +const dbUser = process.env.DB_USER; +const dbPassword = process.env.DB_PASSWORD; +const dbHost = process.env.DB_HOST; +// const dbDriver = process.env.DB_DRIVER; // as Dialect + +const sequelizeConnection = new Sequelize( + dbName, + dbUser, + dbPassword, + { + schema: dbSchema, + host: dbHost || "localhost", + port: process.env.DB_PORT || 5432, + dialect: "postgres", + dialectOptions: { + ssl: process.env.DB_SSL == "true", + }, + pool: { + max: 10, + min: 0, + acquire: 30000, + idle: 10000, + }, + logging: false, + dialectOptions: { + useUTC: false, //for reading from database + dateStrings: true, + typeCast: true + }, + timezone: '+02:00' //for writing to database + // host: "localhost", + // dialect: 'postgres', + // logging: false + } +); + +sequelizeConnection + .authenticate() + .then(() => { + console.log("Connection has been established successfully."); + }) + .catch((err) => { + console.error("Unable to connect to the database:", err); + }); +export default sequelizeConnection; +// export default sequelizeConnection; + +// // relations +// Dataset.hasMany(Title, { +// as: "titles", +// foreignKey: "document_id" +// }); +// Title.belongsTo(Dataset, { +// foreignKey: "document_id", +// as: "dataset", +// }); diff --git a/new-book.html b/new-book.html new file mode 100644 index 0000000..dd177cf --- /dev/null +++ b/new-book.html @@ -0,0 +1,55 @@ + + + + + + + + Create New Book + + + + + +
+
+

Create New Book

+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ + + \ No newline at end of file diff --git a/notes.txt b/notes.txt new file mode 100644 index 0000000..0ab2452 --- /dev/null +++ b/notes.txt @@ -0,0 +1,95 @@ +https://stackabuse.com/building-a-rest-api-with-node-and-express/ +https://github.com/jkasun/simple-rest-sever-express + +touch index.js + +npm install --save express + +node index.js + +npm install --save cors + + +npm install express sequelize pg pg-hstore --save + +neu typescript: -----wieder deinstalliert +npm install reflect-metadata sequelize-typescript --save + +npm install ts-node --save-dev +npm install typescript ts-node-dev @types/node --save-dev + +npm install @types/express @types/validator --save-dev + + + +============ es6: +After creating project install node package run command: + +npm install --save @babel/polyfill + +install node dev dependencies package run command: + +npm install --save-dev @babel/core @babel/cli @babel/preset-env @babel/node nodemon + +npm install --save-dev @babel/preset-typescript +npm install --save-dev @babel/plugin-proposal-class-properties @babel/plugin-proposal-object-rest-spread + + + + +# install locally (recommended) +npm install dotenv --save + +import * as dotenv from "dotenv"; // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import +dotenv.config(); + + + + +npm install --save-dev webpack webpack-cli +npm install --save-dev babel-loader css-loader style-loader +npm install --save core-js + + +npm install sequelize-typescript --save +npm i --save-dev typescript @types/express @types/node tslib@latest +npm install --save-dev @babel/plugin-transform-typescript + +npm install --save core-js regenerator-runtime +npm install --save @overnightjs/core +npm install --save http-status-codes + +====================== xslt =========================================================== + +https://github.com/Saxonica/SaxonJS-Tutorial-2021/tree/main/exercises/ex03 +https://www.saxonica.com/saxon-js/documentation2/index.html#!starting/export/compiling-using-XX +npm install --save-dev xslt3 +xslt3 -xsl:datasetxml2oai-pmh.xslt -export:datasetxml2oai.sef.json -t +./node_modules/xslt3/xslt3.js -xsl:datasetxml2oai-pmh.xslt -export:src/controllers/datasetxml2oai.sef.json -t + +npm install --save saxon-js +============================================================================================= + + +npm install --save-dev prettier +npm install --save-dev eslint eslint-config-prettier eslint-plugin-prettier @typescript-eslint/eslint-plugin @typescript-eslint/parser + +https://khalilstemmler.com/blogs/tooling/prettier/ : + eslint-config-prettier: Turns off all ESLint rules that have the potential to interfere with Prettier rules. + eslint-plugin-prettier: Turns Prettier rules into ESLint rules. +========================================================================================== + + + +npm install --save xmlbuilder2 + + + + +====================== redis +npm install --save redis + + + +npm i sprintf-js --save +npm i --save-dev @types/sprintf-js \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..6b0b6a0 --- /dev/null +++ b/package.json @@ -0,0 +1,70 @@ +{ + "name": "api", + "version": "1.0.0", + "description": "", + "scripts": { + "type-check": "tsc --noEmit", + "test": "echo \"Error: no test specified\" && exit 1", + "babel-node": "npx babel-node --extensions \".ts,.tsx,.js\" -- src/server.ts", + "dev": "nodemon ./src/server.ts --exec babel-node --extensions \".ts,.tsx,.js\"", + "build:types": "tsc --emitDeclarationOnly", + "compress:xslt": "./node_modules/xslt3/xslt3.js -xsl:datasetxml2oai-pmh.xslt -export:dist/controllers/datasetxml2oai.sef.json -t", + "build:js": "rm -rf dist && babel src --out-dir dist --extensions \".ts,.tsx,.js\" & npm run compress:xslt", + "build": "rm -rf dist && tsc --build", + "start": "node dist/server.js", + "format": "prettier --config .prettierrc --check src/**/*.ts", + "eslint:fix": "eslint ./src/ --fix --ext .js,.ts", + "lint": "eslint ./src --ext .js,.ts" + }, + "keywords": [ + "nodemon", + "node", + "babel", + "babel/preset-typescript" + ], + "author": "", + "license": "MIT", + "dependencies": { + "@overnightjs/core": "^1.7.6", + "body-parser": "^1.20.0", + "cd": "^0.3.3", + "core-js": "^3.25.5", + "cors": "^2.8.5", + "dayjs": "^1.11.5", + "dotenv": "^16.0.2", + "express": "^4.18.1", + "http-status-codes": "^2.2.0", + "jet-logger": "^1.2.6", + "pg": "^8.8.0", + "pg-hstore": "^2.3.4", + "redis": "^4.3.1", + "regenerator-runtime": "^0.13.9", + "saxon-js": "^2.5.0", + "sequelize": "^6.21.6", + "sequelize-typescript": "^2.1.3", + "sprintf-js": "^1.1.2", + "xmlbuilder2": "^3.0.2" + }, + "devDependencies": { + "@babel/cli": "^7.18.10", + "@babel/core": "^7.19.1", + "@babel/node": "^7.19.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-decorators": "^7.19.3", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/preset-env": "^7.19.1", + "@babel/preset-typescript": "^7.18.6", + "@types/express": "^4.17.14", + "@types/node": "^18.7.23", + "@types/sprintf-js": "^1.1.2", + "@typescript-eslint/eslint-plugin": "^5.40.1", + "@typescript-eslint/parser": "^5.40.1", + "eslint": "^8.25.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.1", + "nodemon": "^2.0.20", + "prettier": "^2.7.1", + "typescript": "^4.8.4", + "xslt3": "^2.5.0" + } +} diff --git a/prefixes/oai2_style.xslt b/prefixes/oai2_style.xslt new file mode 100755 index 0000000..9ba1dda --- /dev/null +++ b/prefixes/oai2_style.xslt @@ -0,0 +1,655 @@ + + + + + + + + + + + + + + + +html, button, input, select, textarea, .pure-g [class *= "pure-u"] { + font-family: 'Open Sans', sans-serif; +} +td.value { + vertical-align: top; + padding-left: 1em; + padding: 3px; +} +td.key { + background-color: #3abac4; + padding: 3px; + text-align: right; + border: 1px solid #c0c0c0; + white-space: nowrap; + font-weight: bold; + vertical-align: top; +} +.dcdata td.key { + background-color: #ffffe0; +} +body { + margin: 1em 2em 1em 2em; +} +h1, h2, h3 { + font-family: sans-serif; + clear: left; +} +h1 { + padding-bottom: 4px; + margin-bottom: 0px; +} +h2 { + margin-bottom: 0.5em; +} +h3 { + margin-bottom: 0.3em; + font-size: medium; +} +.link { + border: 1px outset #88f; + background-color: #c0c0ff; + padding: 1px 4px 1px 4px; + font-size: 80%; + text-decoration: none; + font-weight: bold; + font-family: sans-serif; + color: black; +} +.link:hover { + color: red; +} +.link:active { + color: red; + border: 1px inset #88f; + background-color: #a0a0df; +} +.oaiRecord, .oaiRecordTitle { + background-color: #eee; + border-style: solid; + border-color: #d0d0d0; +} +h2.oaiRecordTitle { + background-color: #51565c; + color: #fff; + font-size: medium; + font-weight: bold; + padding: 10px; + border-width: 0px 0px 0px 0px; + margin: 0px; +} +.oaiRecord { + margin-bottom: 3em; + border-width: 2px; + padding: 10px; +} + +.results { + margin-bottom: 1.5em; +} +ul.quicklinks { + margin-top: 2px; + padding: 4px; + text-align: left; + border-bottom: 2px solid #ccc; + border-top: 2px solid #ccc; + clear: left; +} +ul.quicklinks li { + font-size: 80%; + display: inline; + list-style: none; + font-family: sans-serif; +} +p.intro { + font-size: 80%; +} + + + + + + + + + TETHYS OAI 2.0 Request Results + + + + + + + + + + +

TETHYS OAI 2.0 Request Results

+ +

You are viewing an HTML version of the XML OAI response. To see the underlying XML use your web browsers view source option. More information about this XSLT is at the bottom of the page.

+ + +

About the XSLT

+

An XSLT file has converted the OAI-PMH 2.0 responses into XHTML which looks nice in a browser which supports XSLT such as Mozilla, Firebird and Internet Explorer. The XSLT file was created by Christopher Gutteridge at the University of Southampton as part of the GNU EPrints system, and is freely redistributable under the GPL.

If you want to use the XSL file on your own OAI interface you may but due to the way XSLT works you must install the XSL file on the same server as the OAI script, you can't just link to this copy.

For more information or to download the XSL file please see the OAI to XHTML XSLT homepage.

+ + + +
+ + + + + + + + + + + + +
Datestamp of response
Request URL
+ + + +

OAI Error(s)

+

The request could not be completed due to the following error or errors.

+
+ +
+
+ +

Request was of type .

+
+ + + + + + +
+
+
+
+ + + + + + + +
Error Code
+

+
+ + + + + + + + + + + + + + + + + +
Repository Name
Base URL
Protocol Version
Earliest Datestamp
Deleted Record Policy
Granularity
+ + +
+ + + Admin Email + + + + + +

Unsupported Description Type

+

The XSL currently does not support this type of description.

+
+ +
+
+ + + + +

OAI-Identifier

+ + + + + + + + + +
Scheme
Repository Identifier
Delimiter
Sample OAI Identifier
+
+ + + + +

EPrints Description

+

Content

+ + +

Submission Policy

+ +
+

Metadata Policy

+ +

Data Policy

+ + +

Content

+ +
+ +
+ + + +

+
+ +
+
+
+ + +

Comment

+
+
+ + + + +

Friends

+
    + +
+
+ + +
  • + +Identify
  • +
    + + + + +

    Branding

    + + +
    + + +

    Icon

    + + + {br:title} + + + {br:title} + + +
    + + +

    Metadata Rendering Rule

    + + + + + + + +
    URL
    Namespace
    Mime Type
    +
    + + + + + +

    Gateway Information

    + + + + + + + + + + + + + + +
    Source
    Description
    URL
    Notes
    +
    + + + Admin + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Set

    + + + + +
    setName
    +
    + + + + + +

    This is a list of metadata formats available for the record "". Use these links to view the metadata:

    +
    + +

    This is a list of metadata formats available from this archive.

    +
    +
    + +
    + + +

    Metadata Format

    + + + + + + + + + + + + + + +
    metadataPrefix + +
    metadataNamespace
    schema
    +
    + + + + + + + +

    OAI Record:

    +
    + + + +
    +
    + + +

    OAI Record Header

    + + + + + + +
    OAI Identifier + + oai_dc + formats +
    Datestamp
    + +

    This record has been deleted.

    +
    +
    + + +

    "about" part of record container not supported by the XSL

    +
    + + +   + + + + + + setSpec + + Identifiers + Records + + + + + +

    There are more results.

    + + + +
    resumptionToken: + +Resume
    +
    + + + +

    Unknown Metadata Format

    +
    + +
    +
    + + + +
    +

    Dublin Core Metadata (oai_dc)

    + + +
    +
    +
    + + +Title + + +Author or Creator + + +Subject and Keywords + + +Description + + +Publisher + + +Other Contributor + + +Date + + +Resource Type + + +Format + + +Resource Identifier + + +Source + + +Language + + +Relation + + + + + URL + URL not shown as it is very long. + + + + + + + + + + + + + +Coverage + + +Rights Management + + + +
    + <></> +
    +
    + + + + + ="" + + + +.xmlSource { + font-size: 70%; + border: solid #c0c0a0 1px; + background-color: #ffffe0; + padding: 2em 2em 2em 0em; +} +.xmlBlock { + padding-left: 2em; +} +.xmlTagName { + color: #800000; + font-weight: bold; +} +.xmlAttrName { + font-weight: bold; +} +.xmlAttrValue { + color: #0000c0; +} + + +
    \ No newline at end of file diff --git a/prefixes/oai_datacite.xslt b/prefixes/oai_datacite.xslt new file mode 100755 index 0000000..604b1a5 --- /dev/null +++ b/prefixes/oai_datacite.xslt @@ -0,0 +1,426 @@ + + + + + + + + + + + + + + + + + + oai: + + : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dataset + + + + + + + + + + + + + + + + + + + datasets + + + + + + + + + + + + + + + + + + + + Available + + + + + + + created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Abstract + + + + + + + + + + + + + + + + + + + + + + + + + + ABCDEFGHIJKLMNOPQRSTUVQXYZ + abcdefghijklmnopqrstuvwxyz + + + + + + + + + + + + + + + + + + DOI + + + + + + + + <xsl:if test="@Language != ''"> + <xsl:attribute name="xml:lang"> + <xsl:value-of select="@Language" /> + </xsl:attribute> + </xsl:if> + <xsl:if test="@Type != '' and @Type != 'Main'"> + <xsl:attribute name="titleType"> + <xsl:value-of select="@Type" /> + </xsl:attribute> + </xsl:if> + <xsl:value-of select="@Value" /> + + + + + <xsl:if test="@Language != ''"> + <xsl:attribute name="xml:lang"> + <xsl:value-of select="@Language" /> + </xsl:attribute> + </xsl:if> + <xsl:choose> + <xsl:when test="@Type != '' and @Type != 'Sub' and @Type != 'Main'"> + <xsl:attribute name="titleType"> + <xsl:value-of select="@Type" /> + <xsl:text>Title</xsl:text> + </xsl:attribute> + </xsl:when> + <xsl:when test="@Type = 'Sub'"> + <xsl:attribute name="titleType"> + <xsl:value-of select="@Type" /> + <xsl:text>title</xsl:text> + </xsl:attribute> + </xsl:when> + </xsl:choose> + <xsl:value-of select="@Value" /> + + + + + + + + + + + + + + + + + + url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , + + + + ( + + ) + + + + + + + + + + + GBA + + + + + + + + + + + + + + + + + application/geopackage+sqlite3 + + + + + + + + + + + + + + + + + + + + https://spdx.org/licenses/ + + + SPDX + + + + + + + + + + info:eu-repo/semantics/openAccess + + Open Access + + + + + \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..11258be --- /dev/null +++ b/readme.md @@ -0,0 +1,17 @@ +# TETHYS + +TETHYS - Data Publisher for Geoscience Austria is a digital data library and a data publisher for earth system science. Data can be georeferenced in time (date/time) and space (latitude, longitude, depth/height).\ +Please watch our website - [www.tethys.at](https://www.tethys.at) + +---------- + +## Getting Started + +These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See deployment for notes on how to deploy the project on a live system. + + + + +## License + +This project is licensed under the MIT License - see the [license](LICENSE) file for details \ No newline at end of file diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..e1694d1 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,76 @@ +import { Server } from "@overnightjs/core"; +import express from "express"; +import bodyParser from "body-parser"; +import HomeRoutes from "./routes/home.routes.js"; +import { initDB } from "./config/db.config"; +import { DatasetController } from "./controllers/dataset.controller"; +import { OaiController } from "./controllers/oai.controller"; +import * as path from 'path'; + +export class App extends Server { + // private app; + + constructor() { + super(); + // this.app = express(); + this.app.use('/prefixes', express.static(path.join(__dirname, '../prefixes'))); + this.applyMiddleWares(); + // init db and add routes + this.boostrap(); + } + + public start(): void { + const port = process.env.PORT || 3000; + this.app.set("port", port); + this.app.listen(port, () => { + console.log("Server listening on port: " + port); + }); + } + + private applyMiddleWares(): void { + this.app.all("*", function (req, res, next) { + res.setHeader("Access-Control-Allow-Origin", "*"); + res.header("Access-Control-Allow-Methods", "POST, PUT, OPTIONS, DELETE, GET"); + res.header("Access-Control-Max-Age", "3600"); + res.header( + "Access-Control-Allow-Headers", + "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, x-access-token", + ); + next(); + }); + + // this.app.use(bodyParser.json()); + // this.app.use(bodyParser.urlencoded({ extended: true })); + this.app.use(bodyParser.json({ limit: "100mb" })); + this.app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); + this.app.use(bodyParser.json({ type: "application/vnd.api+json" })); + } + + private boostrap(): void { + // Connect to db + initDB() + .then(() => { + console.log("Connection has been established successfully."); + + // addroutes + // this.app.use('/api/dataset', DatasetRoutes); + super.addControllers([new DatasetController(), new OaiController()]); + + this.app.use("/api/", HomeRoutes); + this.app.get("/", (request, response) => { + // response.send('Hello World, from express'); + response.sendFile("/home/administrator/api/new-book.html"); + }); + + // Error handling middleware + // this.app.use(errorHandler); // registration of handler + // this.app.use((err: HTTPException, req: Request, res: Response, next: NextFunction) => { + // console.log('Oops !!, Error occured in req->res cycle ', err.message); + // res.status(err.status).json({ err }); // Send back Error to the Frontend + // }) + }) + .catch((err) => { + console.error("Unable to connect to the database:", err); + }); + } +} diff --git a/src/config/db.config.ts b/src/config/db.config.ts new file mode 100644 index 0000000..634f392 --- /dev/null +++ b/src/config/db.config.ts @@ -0,0 +1,60 @@ +import { Dialect } from "sequelize"; +import { Sequelize } from "sequelize-typescript"; +// import * as dotenv from "dotenv"; // see https://github.com/motdotla/dotenv#how-do-i-use-dotenv-with-import +// dotenv.config(); +// import 'dotenv/config'; +import dotenv from "dotenv"; +dotenv.config(); +// import { Dataset } from '../models/Dataset'; +// import { Abstract } from "../models/Abstract"; +// import DocumentXmlCache from '../models/DocumentXmlCache'; + +// const dbName = process.env.DB_NAME as string +// const dbUser = process.env.DB_USER as string +// const dbHost = process.env.DB_HOST +// const dbDriver = process.env.DB_DRIVER as Dialect +// const dbPassword = process.env.DB_PASSWORD + +const dbSchema = process.env.DB_SCHEMA; +const dbName = process.env.DB_NAME as string; +const dbUser = process.env.DB_USER as string; +const dbPassword = process.env.DB_PASSWORD; +const dbHost = process.env.DB_HOST; +const dbDriver = process.env.DB_DRIVER as Dialect; + +const sequelizeConnection = new Sequelize(dbName, dbUser, dbPassword, { + schema: dbSchema, + host: dbHost || "localhost", + port: 5432, + dialect: dbDriver || "postgres", + dialectOptions: { + ssl: process.env.DB_SSL == "true", + useUTC: false, //for reading from database + dateStrings: true, + typeCast: true, + }, + pool: { + max: 10, + min: 0, + acquire: 30000, + idle: 10000, + }, + logging: false, + timezone: "+02:00", //for writing to database +}); +// sequelizeConnection.addModels([Dataset, Abstract]); +// sequelizeConnection.addModels([DocumentXmlCache]); + +export const initDB = async () => { + await sequelizeConnection.authenticate(); + // .then(() => { + // console.log("Connection has been established successfully."); + // }) + // .catch((err) => { + // console.error("Unable to connect to the database:", err); + // }); +}; + +export default sequelizeConnection; + +// export { Dataset, Abstract }; diff --git a/src/config/oai.config.ts b/src/config/oai.config.ts new file mode 100644 index 0000000..2affeb8 --- /dev/null +++ b/src/config/oai.config.ts @@ -0,0 +1,12 @@ +const config = { + max: { + listidentifiers: 100, + listrecords: 50, + }, + workspacePath: "workspace", +}; +export default config; +// config.api = {}; +// config.api.url = process.env.API_URL || http://my.api.com; +// config.axios = 'General http send information' +// module.exports = config; diff --git a/src/controllers/dataset.controller.ts b/src/controllers/dataset.controller.ts new file mode 100644 index 0000000..92f0eef --- /dev/null +++ b/src/controllers/dataset.controller.ts @@ -0,0 +1,160 @@ +import { Controller, Get } from "@overnightjs/core"; +import dbContext from "../models/init-models.js"; +import { Dataset, User, Person } from "../models/init-models.js"; +import Sequelize from "sequelize"; +const Op = Sequelize.Op; +import { Request, Response } from "express"; +// import Logger from 'jet-logger'; +import { StatusCodes } from "http-status-codes"; + +@Controller("api/dataset") +export class DatasetController { + @Get("") + public async findAll(req: Request, res: Response) { + // const type = req.query.type; + // var condition = type ? { type: { [Op.iLike]: `%${type}%` } } : null;, + const server_state = "published"; + const condition = { server_state: { [Op.eq]: `${server_state}` } }; + + Dataset.findAll({ + where: condition, + include: ["abstracts"], + order: ["server_date_published"], + }) + .then((data) => { + res.send(data); + }) + .catch((err) => { + res.status(500).send({ + message: err.message || "Some error occurred while retrieving datasets.", + }); + }); + } + + @Get(":publish_id") + public async findOne(req: Request, res: Response) { + const publish_id = req.params.publish_id; + + const dataset = await dbContext.Dataset.findOne({ + where: { publish_id: publish_id }, + include: [ + "titles", + "abstracts", + { + model: User, + as: "user", + }, + { + model: Person, + through: { where: { role: "author" } }, + as: "authors", + }, + { + model: Person, + through: { where: { role: "contributor" } }, + as: "contributors", + }, + "subjects", + "coverage", + "licenses", + "project", + "files", + "identifier", + ], + // order: ['server_date_published'], + }); + // .then((data) => { + // if (data) { + // res.send(data); + // } else { + // res.status(404).send({ + // message: `Cannot find Dataset with publish_id=${publish_id}.`, + // }); + // } + // }) + // .catch((err) => { + // res.status(500).send({ + // message: "Error retrieving Dataset with publish_id=" + publish_id, + // }); + // }); + if (dataset) { + res.status(StatusCodes.OK).send(dataset); + } else { + res.status(StatusCodes.NOT_FOUND).send({ + message: `Cannot find Dataset with publish_id=${publish_id}.`, + }); + } + } +} + +// Retrieve all Tutorials from the database. +// export async function findAll(req: Request, res: Response) { +// // const type = req.query.type; +// // var condition = type ? { type: { [Op.iLike]: `%${type}%` } } : null;, +// const server_state = "published"; +// var condition = { server_state: { [Op.eq]: `${server_state}` } }; + +// Dataset.findAll({ +// where: condition, +// include: [ +// "abstracts" +// ], +// order: ['server_date_published'], +// }) +// .then((data) => { +// res.send(data); +// }) +// .catch((err) => { +// res.status(500).send({ +// message: +// err.message || "Some error occurred while retrieving datasets.", +// }); +// }); +// } + +// export async function findOne(req: Request, res: Response) { +// const publish_id = req.params.publish_id; + +// dbContext.Dataset.findOne({ +// where: { publish_id: publish_id }, +// include: [ +// "titles", +// "abstracts", +// { +// model: User, +// as: "user", +// }, +// { +// model: Person, +// through: { where: { role: "author" } }, +// as: "authors", +// }, +// { +// model: Person, +// through: { where: { role: "contributor" } }, +// as: "contributors", +// }, +// "subjects", +// "coverage", +// "licenses", +// "project", +// "files", +// "identifier" +// ], +// // order: ['server_date_published'], +// }) +// .then((data) => { +// if (data) { +// res.send(data); +// } else { +// res.status(404).send({ +// message: `Cannot find Dataset with publish_id=${publish_id}.`, +// }); +// } +// }) +// .catch((err) => { +// res.status(500).send({ +// message: "Error retrieving Dataset with publish_id=" + publish_id, +// }); +// }); +// } diff --git a/src/controllers/datasetxml2oai.sef.json b/src/controllers/datasetxml2oai.sef.json new file mode 100644 index 0000000..201cd09 --- /dev/null +++ b/src/controllers/datasetxml2oai.sef.json @@ -0,0 +1 @@ +{"N":"package","version":"10","packageVersion":"1","saxonVersion":"SaxonJS 2.5","target":"JS","targetVersion":"2","name":"TOP-LEVEL","relocatable":"false","buildDateTime":"2022-11-04T11:56:34.162+01:00","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"co","id":"0","uniform":"true","binds":"6","C":[{"N":"template","flags":"os","module":"oai_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","name":"Q{}RdrDate2","line":"133","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","expand-text":"false","sType":"* ","C":[{"N":"sequence","role":"body","sType":"* ","C":[{"N":"choose","sType":"? ","line":"134","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"134","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate"},{"N":"gc10","op":"<","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"gVarRef","name":"Q{}unixTimestamp","bSlot":"0"},{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}UnixTimestamp"}]}]}]},{"N":"elem","name":"date","sType":"1NE nQ{http://datacite.org/schema/kernel-4}date ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"135","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"dateType","sType":"1NA ","line":"136","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Available"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"let","var":"Q{}embargoDate","slot":"0","sType":"*NT ","line":"141","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"141","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"142","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}embargoDate","slot":"0","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"142"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"145","C":[{"N":"docOrder","sType":"*NE nQ{}CreatedAt","line":"145","C":[{"N":"slash","role":"select","simple":"1","sType":"*NE nQ{}CreatedAt","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"child","nodeTest":"*NE nQ{}CreatedAt","sType":"*NE nQ{}CreatedAt","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "}]}]},{"N":"elem","name":"date","sType":"1NE nQ{http://datacite.org/schema/kernel-4}date ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"146","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"dateType","sType":"1NA ","line":"147","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"created"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"let","var":"Q{}createdAt","slot":"0","sType":"*NT ","line":"152","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"152","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}CreatedAt"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}CreatedAt"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}CreatedAt"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"153","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}createdAt","slot":"0","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"153"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"co","binds":"","id":"1","uniform":"true","C":[{"N":"template","flags":"os","module":"oai_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","name":"Q{}CamelCaseWord","line":"211","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","expand-text":"false","sType":"* ","C":[{"N":"sequence","role":"body","sType":"* ","C":[{"N":"param","name":"Q{}text","slot":"0","sType":"* ","as":"* ","flags":"","line":"212","C":[{"N":"str","sType":"1AS ","val":"","role":"select"},{"N":"supplied","role":"conversion","slot":"0","sType":"* "}]},{"N":"param","name":"Q{}firstLower","slot":"1","sType":"* ","as":"* ","flags":"","line":"213","C":[{"N":"true","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"213"},{"N":"supplied","role":"conversion","slot":"1","sType":"* "}]},{"N":"let","var":"Q{}Upper","slot":"2","sType":"*NT ","line":"214","C":[{"N":"doc","sType":"1ND ","base":"file:///home/administrator/api/prefixes/oai_datacite.xslt","role":"select","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"ABCDEFGHIJKLMNOPQRSTUVQXYZ"}]}]},{"N":"let","var":"Q{}Lower","slot":"3","sType":"*NT ","line":"215","C":[{"N":"doc","sType":"1ND ","base":"file:///home/administrator/api/prefixes/oai_datacite.xslt","role":"select","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"abcdefghijklmnopqrstuvwxyz"}]}]},{"N":"forEach","sType":"*NT ","line":"216","C":[{"N":"fn","name":"tokenize","sType":"*AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"216","C":[{"N":"fn","name":"string","C":[{"N":"first","C":[{"N":"varRef","name":"Q{}text","slot":"0"}]}]},{"N":"str","val":"_"}]},{"N":"sequence","sType":"*NT ","C":[{"N":"choose","sType":"?NT ","type":"item()*","line":"217","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"218","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"fn","name":"position"},{"N":"int","val":"1"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"varRef","name":"Q{}firstLower","slot":"1"},{"N":"true"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"219","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"substring","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"219","C":[{"N":"dot"},{"N":"fn","name":"number","C":[{"N":"int","val":"1"}]},{"N":"fn","name":"number","C":[{"N":"int","val":"1"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"valueOf","flags":"l","sType":"1NT ","line":"222","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"translate","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"222","C":[{"N":"fn","name":"substring","C":[{"N":"dot"},{"N":"fn","name":"number","C":[{"N":"int","val":"1"}]},{"N":"fn","name":"number","C":[{"N":"int","val":"1"}]}]},{"N":"fn","name":"string","C":[{"N":"first","C":[{"N":"varRef","name":"Q{}Lower","slot":"3"}]}]},{"N":"fn","name":"string","C":[{"N":"first","C":[{"N":"varRef","name":"Q{}Upper","slot":"2"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"225","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"substring","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"225","C":[{"N":"dot"},{"N":"fn","name":"number","C":[{"N":"int","val":"2"}]},{"N":"fn","name":"number","C":[{"N":"fn","name":"string-length","C":[{"N":"dot"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]}]}]},{"N":"co","binds":"","id":"2","uniform":"true","C":[{"N":"template","flags":"os","module":"oai_datacite.xslt","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","name":"Q{}AlternateIdentifier","line":"295","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","expand-text":"false","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","C":[{"N":"elem","name":"alternateIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"body","line":"296","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"alternateIdentifierType","sType":"1NA ","line":"297","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"url"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"301","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}landingpage","role":"select","line":"301","C":[{"N":"slash","role":"select","simple":"1","sType":"*NA nQ{}landingpage","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}landingpage","sType":"*NA nQ{}landingpage","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]},{"N":"co","id":"3","uniform":"true","binds":"10 32 17 18 40 33","C":[{"N":"template","flags":"os","module":"datasetxml2oai-pmh.xslt","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","name":"Q{}Rdr_Dataset_Data","line":"257","expand-text":"false","sType":"* ","C":[{"N":"sequence","role":"body","sType":"* ","C":[{"N":"elem","name":"header","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}header ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"258","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"259","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"259","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ServerState"},{"N":"str","val":"deleted"}]},{"N":"att","name":"status","sType":"1NA ","line":"260","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"deleted"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"identifier","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}identifier ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"264","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"oai:"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"266","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}repIdentifier","bSlot":"0","role":"select","line":"266"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":":"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"268","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}PublishId","role":"select","line":"268","C":[{"N":"slash","role":"select","simple":"1","sType":"*NA nQ{}PublishId","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}PublishId","sType":"*NA nQ{}PublishId","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"elem","name":"datestamp","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}datestamp ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"270","C":[{"N":"choose","sType":"*NT ","type":"item()*","line":"271","C":[{"N":"docOrder","sType":"*NE nQ{}ServerDateModified","line":"272","C":[{"N":"slash","role":"select","simple":"1","sType":"*NE nQ{}ServerDateModified","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDateModified","sType":"*NE nQ{}ServerDateModified","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "}]}]},{"N":"let","var":"Q{}dateModified","slot":"0","sType":"*NT ","line":"280","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"280","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDateModified"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDateModified"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDateModified"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"T"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDateModified"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Hour"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":":"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDateModified"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Minute"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":":"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDateModified"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Second"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"Z"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"281","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}dateModified","slot":"0","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"281"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"true"},{"N":"let","var":"Q{}datePublished","slot":"0","sType":"*NT ","line":"291","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"291","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"T"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Hour"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":":"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Minute"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":":"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Second"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"Z"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"292","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}datePublished","slot":"0","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"292"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"applyT","sType":"* ","line":"300","mode":"#unnamed","bSlot":"1","C":[{"N":"docOrder","sType":"*NE nQ{}SetSpec","role":"select","line":"300","C":[{"N":"slash","role":"select","simple":"1","sType":"*NE nQ{}SetSpec","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"child","nodeTest":"*NE nQ{}SetSpec","sType":"*NE nQ{}SetSpec","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "}]}]}]}]}]},{"N":"choose","sType":"? ","type":"item()*","line":"302","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"304","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"2"},{"N":"str","val":"ListIdentifiers"}]},{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ServerState"},{"N":"str","val":"deleted"}]}]},{"N":"elem","name":"metadata","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}metadata ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"306","C":[{"N":"choose","sType":"* ","type":"item()*","line":"308","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"309","C":[{"N":"gVarRef","name":"Q{}oai_metadataPrefix","bSlot":"3"},{"N":"str","val":"oai_dc"}]},{"N":"applyT","sType":"* ","line":"310","mode":"Q{}oai_dc","bSlot":"4","C":[{"N":"dot","sType":"1","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"310"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"312","C":[{"N":"gVarRef","name":"Q{}oai_metadataPrefix","bSlot":"3"},{"N":"str","val":"oai_datacite"}]},{"N":"applyT","sType":"* ","line":"313","mode":"Q{}oai_datacite","bSlot":"5","C":[{"N":"dot","sType":"1","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"313"}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"co","binds":"","id":"4","uniform":"true","C":[{"N":"template","flags":"os","module":"datasetxml2oai-pmh.xslt","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","name":"Q{}RdrDate","line":"515","expand-text":"false","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}date ","C":[{"N":"elem","name":"dc:date","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}date ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"body","line":"516","C":[{"N":"choose","sType":"*NT ","type":"item()*","line":"517","C":[{"N":"docOrder","sType":"*NE nQ{}PublishedDate","line":"518","C":[{"N":"slash","role":"select","simple":"1","sType":"*NE nQ{}PublishedDate","C":[{"N":"treat","as":"N","diag":"13|0|XTTE0510|","C":[{"N":"dot"}]},{"N":"axis","name":"child","nodeTest":"*NE nQ{}PublishedDate","sType":"*NE nQ{}PublishedDate","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "}]}]},{"N":"let","var":"Q{}publishedDate","slot":"0","sType":"*NT ","line":"523","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"523","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PublishedDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PublishedDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PublishedDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"524","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}publishedDate","slot":"0","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"524"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"true"},{"N":"let","var":"Q{}serverDatePublished","slot":"0","sType":"*NT ","line":"531","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"531","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]},{"N":"str","val":"-"},{"N":"fn","name":"format-number","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"532","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}serverDatePublished","slot":"0","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"532"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]},{"N":"co","binds":"","id":"5","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}responseDate","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"6","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}unixTimestamp","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"7","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}email","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"8","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}earliestDatestamp","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"9","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}repositoryName","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"10","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}repIdentifier","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"11","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}doiPrefix","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"12","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}sampleIdentifier","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"13","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}dateDelete","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"14","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}totalIds","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"15","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}res","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"16","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}cursor","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"17","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_verb","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"18","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_metadataPrefix","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"19","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_error_code","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"20","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_error_message","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"21","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}baseURL","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"22","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}setPubType","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"23","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}downloadLink","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"24","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}doiLink","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"25","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}docId","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"26","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}repURL","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"27","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_resumptionToken","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"28","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_identifier","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"29","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_from","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"30","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_until","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","binds":"","id":"31","vis":"PUBLIC","ex:uniform":"true","C":[{"N":"globalParam","name":"Q{}oai_set","sType":"* ","slots":"200","module":"datasetxml2oai-pmh.xslt","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","as":"","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","C":[{"N":"str","sType":"1AS ","val":"","role":"select"}]}]},{"N":"co","id":"32","binds":"5 17 18 21 19 20 39 34 37 35 38 36 3","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"14","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"47","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"/root","prio":"0.5","matches":"NE nQ{}root","C":[{"N":"p.withUpper","role":"match","axis":"parent","sType":"1NE nQ{}root","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","C":[{"N":"p.nodeTest","test":"NE nQ{}root"},{"N":"p.nodeTest","test":"ND"}]},{"N":"sequence","role":"action","sType":"*N ","C":[{"N":"procInst","sType":"1NP ","C":[{"N":"str","sType":"1AS ","val":"xml-stylesheet"},{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"type=\"text/xsl\" href=\"../prefixes/oai2_style.xslt\" title=\"Defaultstyle\""}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"elem","name":"OAI-PMH","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}OAI-PMH ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"54","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xsi:schemaLocation","nsuri":"http://www.w3.org/2001/XMLSchema-instance","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"}]},{"N":"elem","name":"responseDate","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}responseDate ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"55","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"56","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}responseDate","bSlot":"0","role":"select","line":"56"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"request","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}request ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"58","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"59","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"59","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":""}]},{"N":"att","name":"verb","sType":"1NA ","line":"60","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"61","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}oai_verb","bSlot":"1","role":"select","line":"61"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"64","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"64","C":[{"N":"gVarRef","name":"Q{}oai_metadataPrefix","bSlot":"2"},{"N":"str","val":""}]},{"N":"att","name":"metadataPrefix","sType":"1NA ","line":"65","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"66","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}oai_metadataPrefix","bSlot":"2","role":"select","line":"66"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"69","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}baseURL","bSlot":"3","role":"select","line":"69"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"choose","sType":"? ","line":"71","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"71","C":[{"N":"gVarRef","name":"Q{}oai_error_code","bSlot":"4"},{"N":"str","val":""}]},{"N":"elem","name":"error","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}error ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"72","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"code","sType":"1NA ","line":"73","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"74","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}oai_error_code","bSlot":"4","role":"select","line":"74"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"76","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}oai_error_message","bSlot":"5","role":"select","line":"76"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"* ","type":"item()*","line":"81","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"82","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":"GetRecord"}]},{"N":"applyT","sType":"* ","line":"83","mode":"Q{}GetRecord","bSlot":"6","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Datasets","sType":"*NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"83"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"85","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":"Identify"}]},{"N":"applyT","sType":"* ","line":"86","mode":"Q{}Identify","bSlot":"7","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Datasets","sType":"*NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"86"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"88","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":"ListIdentifiers"}]},{"N":"applyT","sType":"* ","line":"89","mode":"Q{}ListIdentifiers","bSlot":"8","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Datasets","sType":"*NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"89"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"91","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":"ListMetadataFormats"}]},{"N":"applyT","sType":"* ","line":"92","mode":"Q{}ListMetadataFormats","bSlot":"9","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Datasets","sType":"*NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"92"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"94","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":"ListRecords"}]},{"N":"applyT","sType":"* ","line":"95","mode":"Q{}ListRecords","bSlot":"10","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Datasets","sType":"*NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"95"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"97","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":"ListSets"}]},{"N":"applyT","sType":"* ","line":"98","mode":"Q{}ListSets","bSlot":"11","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Datasets","sType":"*NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"98"}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]}]},{"N":"templateRule","rank":"1","prec":"0","seq":"23","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"322","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"SetSpec","prio":"0","matches":"NE nQ{}SetSpec","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}SetSpec","sType":"1NE nQ{}SetSpec","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"setSpec","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}setSpec ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"323","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"324","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"324"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"templateRule","rank":"2","prec":"0","seq":"22","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"244","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Rdr_Dataset","prio":"0","matches":"NE nQ{}Rdr_Dataset","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Rdr_Dataset","sType":"1NE nQ{}Rdr_Dataset","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"choose","sType":"* ","type":"item()*","role":"action","line":"245","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"246","C":[{"N":"gVarRef","name":"Q{}oai_verb","bSlot":"1"},{"N":"str","val":"ListIdentifiers"}]},{"N":"callT","bSlot":"12","sType":"* ","name":"Q{}Rdr_Dataset_Data","line":"247"},{"N":"true"},{"N":"elem","name":"record","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}record ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"250","C":[{"N":"callT","bSlot":"12","sType":"* ","name":"Q{}Rdr_Dataset_Data","line":"251"}]}]}]},{"N":"templateRule","rank":"3","prec":"0","seq":"18","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"183","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Rdr_Sets","prio":"0","matches":"NE nQ{}Rdr_Sets","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Rdr_Sets","sType":"1NE nQ{}Rdr_Sets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"set","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}set ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"184","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"setSpec","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}setSpec ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"185","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"186","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"186"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"setName","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}setName ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"188","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"189","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}TypeName","name":"attribute","nodeTest":"*NA nQ{}TypeName","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"189"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]}]},{"N":"co","id":"33","binds":"1 33 10 0 2","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}oai_datacite","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"12","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"381","module":"oai_datacite.xslt","expand-text":"false","match":"File/@MimeType","prio":"0.5","matches":"NA nQ{}MimeType","C":[{"N":"p.withUpper","role":"match","axis":"parent","sType":"1NA nQ{}MimeType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","C":[{"N":"p.nodeTest","test":"NA nQ{}MimeType"},{"N":"p.nodeTest","test":"NE nQ{}File"}]},{"N":"elem","name":"format","sType":"1NE nQ{http://datacite.org/schema/kernel-4}format ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"382","C":[{"N":"choose","sType":"?NT ","type":"item()*","line":"383","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"384","C":[{"N":"dot"},{"N":"str","val":"application/x-sqlite3"}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"application/geopackage+sqlite3"}]},{"N":"true"},{"N":"valueOf","flags":"l","sType":"1NT ","line":"388","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"dot","sType":"1NA nQ{}MimeType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"388"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"1","prec":"0","seq":"13","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"395","module":"oai_datacite.xslt","expand-text":"false","match":"Licence","prio":"0","matches":"NE nQ{}Licence","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Licence","sType":"1NE nQ{}Licence","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"sequence","role":"action","sType":"* ","C":[{"N":"elem","name":"rights","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rights ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"396","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"397","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"398","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"398"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"400","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"400","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}LinkLicence"},{"N":"str","val":""}]},{"N":"att","name":"rightsURI","sType":"1NA ","line":"401","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"402","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LinkLicence","name":"attribute","nodeTest":"*NA nQ{}LinkLicence","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"402"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"att","name":"schemeURI","sType":"1NA ","line":"405","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"https://spdx.org/licenses/"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"rightsIdentifierScheme","sType":"1NA ","line":"408","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"SPDX"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"rightsIdentifier","sType":"1NA ","line":"411","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"412","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Name","name":"attribute","nodeTest":"*NA nQ{}Name","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"412"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"414","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}NameLong","name":"attribute","nodeTest":"*NA nQ{}NameLong","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"414"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"choose","sType":"? ","line":"416","C":[{"N":"or","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"416","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Name"},{"N":"str","val":"CC-BY-4.0"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Name"},{"N":"str","val":"CC-BY-SA-4.0"}]}]},{"N":"elem","name":"rights","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rights ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"417","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"rightsURI","sType":"1NA ","line":"418","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"info:eu-repo/semantics/openAccess"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Open Access"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"templateRule","rank":"2","prec":"0","seq":"11","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"338","module":"oai_datacite.xslt","expand-text":"false","match":"PersonAuthor","prio":"0","matches":"NE nQ{}PersonAuthor","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}PersonAuthor","sType":"1NE nQ{}PersonAuthor","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"creator","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creator ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"339","C":[{"N":"sequence","sType":"* ","C":[{"N":"elem","name":"creatorName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creatorName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"340","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"341","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"341","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}NameType"},{"N":"str","val":""}]},{"N":"att","name":"nameType","sType":"1NA ","line":"342","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"343","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}NameType","name":"attribute","nodeTest":"*NA nQ{}NameType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"343"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"346","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"346"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"? ","line":"347","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"347","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}FirstName"},{"N":"str","val":""}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":", "}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"350","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"350"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"* ","line":"351","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"351","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle"},{"N":"str","val":""}]},{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" ("}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"353","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}AcademicTitle","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"353"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":")"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"choose","sType":"* ","line":"358","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"358","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}NameType"},{"N":"str","val":"Personal"}]},{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"givenName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}givenName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"359","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"360","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"360"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"familyName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}familyName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"362","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"363","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"363"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"affiliation","sType":"1NE nQ{http://datacite.org/schema/kernel-4}affiliation ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"365","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"GBA"}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"368","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"368","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}IdentifierOrcid"},{"N":"str","val":""}]},{"N":"elem","name":"nameIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}nameIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"369","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"schemeURI","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://orcid.org/"}]},{"N":"att","name":"nameIdentifierScheme","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"ORCID"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"370","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}IdentifierOrcid","name":"attribute","nodeTest":"*NA nQ{}IdentifierOrcid","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"370"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"templateRule","rank":"3","prec":"0","seq":"10","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"319","module":"oai_datacite.xslt","expand-text":"false","match":"PersonContributor","prio":"0","matches":"NE nQ{}PersonContributor","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}PersonContributor","sType":"1NE nQ{}PersonContributor","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"contributor","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributor ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"320","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"321","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"321","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ContributorType"},{"N":"str","val":""}]},{"N":"att","name":"contributorType","sType":"1NA ","line":"322","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"323","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}ContributorType","name":"attribute","nodeTest":"*NA nQ{}ContributorType","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"323"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"contributorName","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributorName ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"326","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"332","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"332","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}FirstName"}]}]},{"N":"str","val":" "},{"N":"atomSing","diag":"0|2||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}LastName"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]},{"N":"templateRule","rank":"4","prec":"0","seq":"9","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"306","module":"oai_datacite.xslt","expand-text":"false","match":"Reference","prio":"0","matches":"NE nQ{}Reference","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Reference","sType":"1NE nQ{}Reference","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"relatedIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}relatedIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"307","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"relatedIdentifierType","sType":"1NA ","line":"308","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"309","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"309"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"relationType","sType":"1NA ","line":"311","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"312","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Relation","name":"attribute","nodeTest":"*NA nQ{}Relation","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"312"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"314","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"314"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"5","prec":"0","seq":"8","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"295","module":"oai_datacite.xslt","expand-text":"false","match":"AlternateIdentifier","prio":"0","matches":"NE nQ{}AlternateIdentifier","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}AlternateIdentifier","sType":"1NE nQ{}AlternateIdentifier","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"alternateIdentifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"296","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"alternateIdentifierType","sType":"1NA ","line":"297","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"url"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"301","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}landingpage","name":"attribute","nodeTest":"*NA nQ{}landingpage","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"301"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"6","prec":"0","seq":"7","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"283","module":"oai_datacite.xslt","expand-text":"false","match":"Subject","prio":"0","matches":"NE nQ{}Subject","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Subject","sType":"1NE nQ{}Subject","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"subject","sType":"1NE nQ{http://datacite.org/schema/kernel-4}subject ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"284","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"285","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"285","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"286","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"287","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"287"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"290","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"290"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"7","prec":"0","seq":"6","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"257","module":"oai_datacite.xslt","expand-text":"false","match":"TitleAdditional","prio":"0","matches":"NE nQ{}TitleAdditional","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleAdditional","sType":"1NE nQ{}TitleAdditional","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"title","sType":"1NE nQ{http://datacite.org/schema/kernel-4}title ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"258","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"259","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"259","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"260","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"261","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"261"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","type":"item()*","line":"264","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"265","C":[{"N":"and","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":""}]},{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":"Sub"}]}]},{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":"Main"}]}]},{"N":"att","name":"titleType","sType":"1NA ","line":"266","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"267","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"267"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Title"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"271","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":"Sub"}]},{"N":"att","name":"titleType","sType":"1NA ","line":"272","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"273","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"273"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"title"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"278","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"278"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"8","prec":"0","seq":"5","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"241","module":"oai_datacite.xslt","expand-text":"false","match":"TitleMain","prio":"0","matches":"NE nQ{}TitleMain","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleMain","sType":"1NE nQ{}TitleMain","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"title","sType":"1NE nQ{http://datacite.org/schema/kernel-4}title ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"242","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"243","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"243","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"244","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"245","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"245"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"248","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"248","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":""}]},{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":"Main"}]}]},{"N":"att","name":"titleType","sType":"1NA ","line":"249","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"250","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Type","name":"attribute","nodeTest":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"250"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"253","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"253"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"9","prec":"0","seq":"4","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"231","module":"oai_datacite.xslt","expand-text":"false","match":"Identifier","prio":"0","matches":"NE nQ{}Identifier","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Identifier","sType":"1NE nQ{}Identifier","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"identifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}identifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"232","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"identifierType","sType":"1NA ","line":"233","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"DOI"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"236","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"236"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"10","prec":"0","seq":"3","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"194","module":"oai_datacite.xslt","expand-text":"false","match":"TitleAbstractAdditional","prio":"0","matches":"NE nQ{}TitleAbstractAdditional","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleAbstractAdditional","sType":"1NE nQ{}TitleAbstractAdditional","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"description","sType":"1NE nQ{http://datacite.org/schema/kernel-4}description ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"195","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"196","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"197","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"197"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"199","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"199","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":""}]},{"N":"att","name":"descriptionType","sType":"1NA ","line":"200","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"callT","sType":"* ","bSlot":"0","name":"Q{}CamelCaseWord","line":"201","C":[{"N":"withParam","name":"Q{}text","slot":"0","sType":"*NA nQ{}Type","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type","sType":"*NA nQ{}Type","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"202"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"206","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"206"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"11","prec":"0","seq":"2","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"179","module":"oai_datacite.xslt","expand-text":"false","match":"TitleAbstract","prio":"0","matches":"NE nQ{}TitleAbstract","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleAbstract","sType":"1NE nQ{}TitleAbstract","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"description","sType":"1NE nQ{http://datacite.org/schema/kernel-4}description ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"180","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"181","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"182","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"182"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"choose","sType":"? ","line":"184","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","line":"184","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Type"},{"N":"str","val":""}]},{"N":"att","name":"descriptionType","sType":"1NA ","line":"185","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Abstract"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"190","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"190"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"12","prec":"0","seq":"1","ns":"xml=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"159","module":"oai_datacite.xslt","expand-text":"false","match":"Coverage","prio":"0","matches":"NE nQ{}Coverage","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Coverage","sType":"1NE nQ{}Coverage","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"geoLocation","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocation ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"160","C":[{"N":"elem","name":"geoLocationBox","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocationBox ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"161","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"westBoundLongitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}westBoundLongitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"162","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"163","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}XMin","name":"attribute","nodeTest":"*NA nQ{}XMin","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"163"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"eastBoundLongitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}eastBoundLongitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"165","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"166","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}XMax","name":"attribute","nodeTest":"*NA nQ{}XMax","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"166"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"southBoundLatitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}southBoundLatitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"168","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"169","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}YMin","name":"attribute","nodeTest":"*NA nQ{}YMin","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"169"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"northBoundLatitude","sType":"1NE nQ{http://datacite.org/schema/kernel-4}northBoundLatitude ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"171","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"172","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}YMax","name":"attribute","nodeTest":"*NA nQ{}YMax","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ ","role":"select","line":"172"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]},{"N":"templateRule","rank":"13","prec":"0","seq":"0","ns":"xml=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/prefixes/oai_datacite.xslt","line":"39","module":"oai_datacite.xslt","expand-text":"false","match":"Rdr_Dataset","prio":"0","matches":"NE nQ{}Rdr_Dataset","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Rdr_Dataset","sType":"1NE nQ{}Rdr_Dataset","ns":"= xml=~ fn=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ xsi=~ "},{"N":"elem","name":"resource","sType":"1NE nQ{http://datacite.org/schema/kernel-4}resource ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","ns":"xml=~ xsi=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","role":"action","line":"41","C":[{"N":"sequence","ns":"xml=~ xsi=~ =http://datacite.org/schema/kernel-4 xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","sType":"* ","C":[{"N":"att","name":"xsi:schemaLocation","nsuri":"http://www.w3.org/2001/XMLSchema-instance","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.3/metadata.xsd"}]},{"N":"choose","sType":"* ","type":"item()*","line":"45","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Identifier","sType":"*NE nQ{}Identifier","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"46"},{"N":"applyT","sType":"* ","line":"47","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Identifier","sType":"*NE nQ{}Identifier","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"47"}]},{"N":"true"},{"N":"elem","name":"identifier","sType":"1NE nQ{http://datacite.org/schema/kernel-4}identifier ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"50","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"oai:"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"52","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}repIdentifier","bSlot":"2","role":"select","line":"52"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":":"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"54","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}PublishId","name":"attribute","nodeTest":"*NA nQ{}PublishId","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"54"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"elem","name":"creators","sType":"1NE nQ{http://datacite.org/schema/kernel-4}creators ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"60","C":[{"N":"applyT","sType":"* ","line":"61","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PersonAuthor","sType":"*NE nQ{}PersonAuthor","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"61"}]}]},{"N":"elem","name":"titles","sType":"1NE nQ{http://datacite.org/schema/kernel-4}titles ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"63","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"64","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleMain","sType":"*NE nQ{}TitleMain","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"64"}]},{"N":"applyT","sType":"* ","line":"65","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleAdditional","sType":"*NE nQ{}TitleAdditional","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"65"}]}]}]},{"N":"elem","name":"publisher","sType":"1NE nQ{http://datacite.org/schema/kernel-4}publisher ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"67","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"69","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}CreatingCorporation","name":"attribute","nodeTest":"*NA nQ{}CreatingCorporation","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"69"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"publicationYear","sType":"1NE nQ{http://datacite.org/schema/kernel-4}publicationYear ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"71","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"72","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}Year","role":"select","line":"72","C":[{"N":"slash","op":"/","sType":"*NA nQ{}Year","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}ServerDatePublished"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"subjects","sType":"1NE nQ{http://datacite.org/schema/kernel-4}subjects ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"74","C":[{"N":"applyT","sType":"* ","line":"75","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Subject","sType":"*NE nQ{}Subject","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"75"}]}]},{"N":"elem","name":"language","sType":"1NE nQ{http://datacite.org/schema/kernel-4}language ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"77","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"78","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"78"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"choose","sType":"? ","line":"80","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PersonContributor","sType":"*NE nQ{}PersonContributor","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"80"},{"N":"elem","name":"contributors","sType":"1NE nQ{http://datacite.org/schema/kernel-4}contributors ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"81","C":[{"N":"applyT","sType":"* ","line":"82","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PersonContributor","sType":"*NE nQ{}PersonContributor","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"82"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"dates","sType":"1NE nQ{http://datacite.org/schema/kernel-4}dates ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"85","C":[{"N":"callT","bSlot":"3","sType":"* ","name":"Q{}RdrDate2","line":"86"}]},{"N":"elem","name":"resourceType","sType":"1NE nQ{http://datacite.org/schema/kernel-4}resourceType ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"88","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"resourceTypeGeneral","nsuri":"","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"Dataset"}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Dataset"}]}]}]},{"N":"elem","name":"alternateIdentifiers","sType":"1NE nQ{http://datacite.org/schema/kernel-4}alternateIdentifiers ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"93","C":[{"N":"callT","bSlot":"4","sType":"* ","name":"Q{}AlternateIdentifier","line":"94"}]},{"N":"choose","sType":"? ","line":"97","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Reference","sType":"*NE nQ{}Reference","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","line":"97"},{"N":"elem","name":"relatedIdentifiers","sType":"1NE nQ{http://datacite.org/schema/kernel-4}relatedIdentifiers ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"98","C":[{"N":"applyT","sType":"* ","line":"99","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Reference","sType":"*NE nQ{}Reference","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"99"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"elem","name":"rightsList","sType":"1NE nQ{http://datacite.org/schema/kernel-4}rightsList ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"102","C":[{"N":"applyT","sType":"* ","line":"103","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Licence","sType":"*NE nQ{}Licence","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"103"}]}]},{"N":"elem","name":"sizes","sType":"1NE nQ{http://datacite.org/schema/kernel-4}sizes ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"105","C":[{"N":"elem","name":"size","sType":"1NE nQ{http://datacite.org/schema/kernel-4}size ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"106","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"107","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"fn","sType":"1ADI","name":"count","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"107","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}File"}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" datasets"}]}]}]}]},{"N":"elem","name":"formats","sType":"1NE nQ{http://datacite.org/schema/kernel-4}formats ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"111","C":[{"N":"applyT","sType":"* ","line":"112","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"docOrder","sType":"*NA nQ{}MimeType","role":"select","line":"112","C":[{"N":"slash","op":"/","sType":"*NA nQ{}MimeType","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}File"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}MimeType"}]}]}]}]},{"N":"elem","name":"descriptions","sType":"1NE nQ{http://datacite.org/schema/kernel-4}descriptions ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"114","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"115","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleAbstract","sType":"*NE nQ{}TitleAbstract","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"115"}]},{"N":"applyT","sType":"* ","line":"116","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleAbstractAdditional","sType":"*NE nQ{}TitleAbstractAdditional","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"116"}]}]}]},{"N":"elem","name":"geoLocations","sType":"1NE nQ{http://datacite.org/schema/kernel-4}geoLocations ","nsuri":"http://datacite.org/schema/kernel-4","namespaces":"=http://datacite.org/schema/kernel-4 xsi=http://www.w3.org/2001/XMLSchema-instance oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/","line":"118","C":[{"N":"applyT","sType":"* ","line":"119","mode":"Q{}oai_datacite","bSlot":"1","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Coverage","sType":"*NE nQ{}Coverage","ns":"= xml=~ fn=~ xsi=~ xsl=~ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ dc=http://purl.org/dc/elements/1.1/ ","role":"select","line":"119"}]}]}]}]}]}]}]},{"N":"co","id":"34","binds":"9 21 7 8 10 12","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}Identify","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"15","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"106","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Datasets","prio":"0","matches":"NE nQ{}Datasets","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Datasets","sType":"1NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"Identify","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}Identify ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"107","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"repositoryName","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}repositoryName ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"108","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"109","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}repositoryName","bSlot":"0","role":"select","line":"109"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"baseURL","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}baseURL ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"111","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"112","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}baseURL","bSlot":"1","role":"select","line":"112"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"protocolVersion","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}protocolVersion ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"114","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"2.0"}]}]},{"N":"elem","name":"adminEmail","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}adminEmail ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"117","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"118","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}email","bSlot":"2","role":"select","line":"118"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"earliestDatestamp","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}earliestDatestamp ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"120","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"121","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}earliestDatestamp","bSlot":"3","role":"select","line":"121"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"deletedRecord","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}deletedRecord ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"123","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"persistent"}]}]},{"N":"elem","name":"granularity","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}granularity ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"126","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"YYYY-MM-DDThh:mm:ssZ"}]}]},{"N":"elem","name":"description","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}description ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"129","C":[{"N":"elem","name":"oai-identifier","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/oai-identifier}oai-identifier ","nsuri":"http://www.openarchives.org/OAI/2.0/oai-identifier","namespaces":"=http://www.openarchives.org/OAI/2.0/oai-identifier xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/oai-identifier xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"130","C":[{"N":"sequence","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/oai-identifier xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","sType":"*N ","C":[{"N":"att","name":"xsi:schemaLocation","nsuri":"http://www.w3.org/2001/XMLSchema-instance","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://www.openarchives.org/OAI/2.0/oai-identifier http://www.openarchives.org/OAI/2.0/oai-identifier.xsd"}]},{"N":"elem","name":"scheme","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/oai-identifier}scheme ","nsuri":"http://www.openarchives.org/OAI/2.0/oai-identifier","namespaces":"=http://www.openarchives.org/OAI/2.0/oai-identifier xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"131","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"oai"}]}]},{"N":"elem","name":"repositoryIdentifier","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/oai-identifier}repositoryIdentifier ","nsuri":"http://www.openarchives.org/OAI/2.0/oai-identifier","namespaces":"=http://www.openarchives.org/OAI/2.0/oai-identifier xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"134","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"135","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}repIdentifier","bSlot":"4","role":"select","line":"135"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"elem","name":"delimiter","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/oai-identifier}delimiter ","nsuri":"http://www.openarchives.org/OAI/2.0/oai-identifier","namespaces":"=http://www.openarchives.org/OAI/2.0/oai-identifier xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"137","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":":"}]}]},{"N":"elem","name":"sampleIdentifier","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/oai-identifier}sampleIdentifier ","nsuri":"http://www.openarchives.org/OAI/2.0/oai-identifier","namespaces":"=http://www.openarchives.org/OAI/2.0/oai-identifier xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"140","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"141","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}sampleIdentifier","bSlot":"5","role":"select","line":"141"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]}]}]}]}]}]}]},{"N":"co","binds":"","id":"35","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}ListMetadataFormats","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"16","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"150","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Datasets","prio":"0","matches":"NE nQ{}Datasets","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Datasets","sType":"1NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"ListMetadataFormats","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}ListMetadataFormats ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"151","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"metadataFormat","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}metadataFormat ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"152","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"metadataPrefix","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}metadataPrefix ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"153","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"oai_dc"}]}]},{"N":"elem","name":"schema","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}schema ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"156","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"http://www.openarchives.org/OAI/2.0/oai_dc.xsd"}]}]},{"N":"elem","name":"metadataNamespace","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}metadataNamespace ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"159","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"http://www.openarchives.org/OAI/2.0/oai_dc/"}]}]}]}]},{"N":"elem","name":"metadataFormat","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}metadataFormat ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"163","C":[{"N":"sequence","sType":"*NE ","C":[{"N":"elem","name":"metadataPrefix","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}metadataPrefix ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"164","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"oai_datacite"}]}]},{"N":"elem","name":"schema","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}schema ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"167","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"http://schema.datacite.org/meta/kernel-4.3/metadata.xsd"}]}]},{"N":"elem","name":"metadataNamespace","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}metadataNamespace ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"170","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"http://datacite.org/schema/kernel-4"}]}]}]}]}]}]}]}]}]},{"N":"co","id":"36","binds":"32","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}ListSets","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"17","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"177","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Datasets","prio":"0","matches":"NE nQ{}Datasets","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Datasets","sType":"1NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"ListSets","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}ListSets ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"178","C":[{"N":"applyT","sType":"* ","line":"179","mode":"#unnamed","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Rdr_Sets","sType":"*NE nQ{}Rdr_Sets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"179"}]}]}]}]}]},{"N":"co","id":"37","binds":"32 14 13 16 15","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}ListIdentifiers","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"19","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"194","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Datasets","prio":"0","matches":"NE nQ{}Datasets","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Datasets","sType":"1NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"choose","sType":"? ","role":"action","line":"195","C":[{"N":"gc10","op":">","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"195","C":[{"N":"fn","name":"count","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Rdr_Dataset"}]},{"N":"int","val":"0"}]},{"N":"elem","name":"ListIdentifiers","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}ListIdentifiers ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"196","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"197","mode":"#unnamed","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Rdr_Dataset","sType":"*NE nQ{}Rdr_Dataset","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"197"}]},{"N":"choose","sType":"? ","line":"198","C":[{"N":"gc10","op":">","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"198","C":[{"N":"gVarRef","name":"Q{}totalIds","bSlot":"1"},{"N":"int","val":"0"}]},{"N":"elem","name":"resumptionToken","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}resumptionToken ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"199","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"expirationDate","sType":"1NA ","line":"200","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"201","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}dateDelete","bSlot":"2","role":"select","line":"201"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"completeListSize","sType":"1NA ","line":"203","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"204","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}totalIds","bSlot":"1","role":"select","line":"204"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"cursor","sType":"1NA ","line":"206","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"207","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}cursor","bSlot":"3","role":"select","line":"207"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"209","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}res","bSlot":"4","role":"select","line":"209"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"co","id":"38","binds":"32 14 13 16 15","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}ListRecords","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"20","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"216","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Datasets","prio":"0","matches":"NE nQ{}Datasets","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Datasets","sType":"1NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"choose","sType":"? ","role":"action","line":"217","C":[{"N":"gc10","op":">","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"217","C":[{"N":"fn","name":"count","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Rdr_Dataset"}]},{"N":"int","val":"0"}]},{"N":"elem","name":"ListRecords","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}ListRecords ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"218","C":[{"N":"sequence","sType":"* ","C":[{"N":"applyT","sType":"* ","line":"219","mode":"#unnamed","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Rdr_Dataset","sType":"*NE nQ{}Rdr_Dataset","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"219"}]},{"N":"choose","sType":"? ","line":"220","C":[{"N":"gc10","op":">","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"220","C":[{"N":"gVarRef","name":"Q{}totalIds","bSlot":"1"},{"N":"int","val":"0"}]},{"N":"elem","name":"resumptionToken","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}resumptionToken ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"221","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"expirationDate","sType":"1NA ","line":"222","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"223","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}dateDelete","bSlot":"2","role":"select","line":"223"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"completeListSize","sType":"1NA ","line":"225","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"226","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}totalIds","bSlot":"1","role":"select","line":"226"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"att","name":"cursor","sType":"1NA ","line":"228","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"229","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}cursor","bSlot":"3","role":"select","line":"229"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"231","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"gVarRef","sType":"* ","name":"Q{}res","bSlot":"4","role":"select","line":"231"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"co","id":"39","binds":"32","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}GetRecord","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"21","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"238","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Datasets","prio":"0","matches":"NE nQ{}Datasets","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Datasets","sType":"1NE nQ{}Datasets","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"GetRecord","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/}GetRecord ","nsuri":"http://www.openarchives.org/OAI/2.0/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"239","C":[{"N":"applyT","sType":"* ","line":"240","mode":"#unnamed","bSlot":"0","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Rdr_Dataset","sType":"*NE nQ{}Rdr_Dataset","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"240"}]}]}]}]}]},{"N":"co","id":"40","binds":"11 6 40 4","C":[{"N":"mode","onNo":"TC","flags":"","patternSlots":"0","name":"Q{}oai_dc","prec":"","C":[{"N":"templateRule","rank":"0","prec":"0","seq":"35","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"563","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"File/@MimeType","prio":"0.5","matches":"NA nQ{}MimeType","C":[{"N":"p.withUpper","role":"match","axis":"parent","sType":"1NA nQ{}MimeType","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","C":[{"N":"p.nodeTest","test":"NA nQ{}MimeType"},{"N":"p.nodeTest","test":"NE nQ{}File"}]},{"N":"elem","name":"dc:format","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}format ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"564","C":[{"N":"choose","sType":"?NT ","type":"item()*","line":"565","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"566","C":[{"N":"dot"},{"N":"str","val":"application/x-sqlite3"}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"application/geopackage+sqlite3"}]},{"N":"true"},{"N":"valueOf","flags":"l","sType":"1NT ","line":"570","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"dot","sType":"1NA nQ{}MimeType","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"570"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"1","prec":"0","seq":"39","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"602","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Licence","prio":"0","matches":"NE nQ{}Licence","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Licence","sType":"1NE nQ{}Licence","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"sequence","role":"action","sType":"* ","C":[{"N":"elem","name":"dc:rights","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}rights ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"603","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"604","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}NameLong","name":"attribute","nodeTest":"*NA nQ{}NameLong","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"604"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"choose","sType":"? ","line":"606","C":[{"N":"or","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"606","C":[{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Name"},{"N":"str","val":"CC-BY-4.0"}]},{"N":"gc10","op":"=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Name"},{"N":"str","val":"CC-BY-SA-4.0"}]}]},{"N":"elem","name":"dc:rights","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}rights ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"607","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"info:eu-repo/semantics/openAccess"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]},{"N":"templateRule","rank":"2","prec":"0","seq":"38","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"596","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"@Language","prio":"0","matches":"NA nQ{}Language","C":[{"N":"p.nodeTest","role":"match","test":"NA nQ{}Language","sType":"1NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:language","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}language ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"597","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"598","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"dot","sType":"1NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"598"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"templateRule","rank":"3","prec":"0","seq":"37","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"590","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"@CreatingCorporation","prio":"0","matches":"NA nQ{}CreatingCorporation","C":[{"N":"p.nodeTest","role":"match","test":"NA nQ{}CreatingCorporation","sType":"1NA nQ{}CreatingCorporation","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:language","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}language ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"591","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"592","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"dot","sType":"1NA nQ{}CreatingCorporation","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"592"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"templateRule","rank":"4","prec":"0","seq":"36","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"583","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Identifier","prio":"0","matches":"NE nQ{}Identifier","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Identifier","sType":"1NE nQ{}Identifier","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:relation","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}relation ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"584","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"586","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"586","C":[{"N":"atomSing","diag":"0|0||concat","card":"?","C":[{"N":"first","C":[{"N":"gVarRef","name":"Q{}doiPrefix","bSlot":"0"}]}]},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Value"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"templateRule","rank":"5","prec":"0","seq":"34","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"538","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"EmbargoDate","prio":"0","matches":"NE nQ{}EmbargoDate","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}EmbargoDate","sType":"1NE nQ{}EmbargoDate","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"choose","sType":"? ","role":"action","line":"539","C":[{"N":"gc10","op":"<","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"539","C":[{"N":"gVarRef","name":"Q{}unixTimestamp","bSlot":"1"},{"N":"slash","op":"/","C":[{"N":"dot"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}UnixTimestamp"}]}]},{"N":"elem","name":"dc:date","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}date ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"540","C":[{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"info:eu-repo/date/embargoEnd/"}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"542","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"docOrder","sType":"*NA nQ{}Year","role":"select","line":"542","C":[{"N":"slash","op":"/","sType":"*NA nQ{}Year","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","C":[{"N":"dot"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Year"}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"\n -\n "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"544","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"format-number","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"544","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"dot"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Month"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"\n -\n "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"546","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"format-number","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"546","C":[{"N":"fn","name":"number","C":[{"N":"atomSing","diag":"0|0||number","card":"?","C":[{"N":"first","C":[{"N":"slash","op":"/","C":[{"N":"dot"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Day"}]}]}]}]},{"N":"str","val":"00"}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]},{"N":"templateRule","rank":"6","prec":"0","seq":"33","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"500","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"PersonContributor","prio":"0","matches":"NE nQ{}PersonContributor","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}PersonContributor","sType":"1NE nQ{}PersonContributor","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:contributor","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}contributor ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"501","C":[{"N":"sequence","sType":"* ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"502","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"502"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"? ","line":"503","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"503","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}FirstName"},{"N":"str","val":""}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":", "}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"506","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"506"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"* ","line":"507","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"507","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle"},{"N":"str","val":""}]},{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" ("}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"509","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}AcademicTitle","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"509"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":")"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"templateRule","rank":"7","prec":"0","seq":"32","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"485","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"PersonAuthor|PersonEditor","prio":"0","matches":"NE nQ{}PersonAuthor","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}PersonAuthor","sType":"1NE nQ{}PersonAuthor"},{"N":"elem","name":"dc:creator","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}creator ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"486","C":[{"N":"sequence","sType":"* ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"487","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"487"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"? ","line":"488","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"488","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}FirstName"},{"N":"str","val":""}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":", "}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"491","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"491"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"* ","line":"492","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"492","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle"},{"N":"str","val":""}]},{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" ("}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"494","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}AcademicTitle","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"494"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":")"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"templateRule","rank":"8","prec":"0","seq":"32","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"485","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"PersonAuthor|PersonEditor","prio":"0","matches":"NE nQ{}PersonEditor","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}PersonEditor","sType":"1NE nQ{}PersonEditor"},{"N":"elem","name":"dc:creator","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}creator ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"486","C":[{"N":"sequence","sType":"* ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"487","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}LastName","name":"attribute","nodeTest":"*NA nQ{}LastName","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"487"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"? ","line":"488","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"488","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}FirstName"},{"N":"str","val":""}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":", "}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"491","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}FirstName","name":"attribute","nodeTest":"*NA nQ{}FirstName","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"491"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"* ","line":"492","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"492","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle"},{"N":"str","val":""}]},{"N":"sequence","sType":"*NT ","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":" ("}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"494","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}AcademicTitle","name":"attribute","nodeTest":"*NA nQ{}AcademicTitle","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"494"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":")"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]},{"N":"templateRule","rank":"9","prec":"0","seq":"31","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"478","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Reference","prio":"0","matches":"NE nQ{}Reference","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Reference","sType":"1NE nQ{}Reference","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:relation","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}relation ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"479","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"480","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"480"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"templateRule","rank":"10","prec":"0","seq":"30","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"467","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Subject","prio":"0","matches":"NE nQ{}Subject","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Subject","sType":"1NE nQ{}Subject","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:subject","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}subject ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"468","C":[{"N":"sequence","sType":"* ","C":[{"N":"choose","sType":"? ","line":"469","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"469","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Language"},{"N":"str","val":""}]},{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"470","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"471","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"471"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"474","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"474"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"11","prec":"0","seq":"29","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"458","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"TitleAbstractAdditional","prio":"0","matches":"NE nQ{}TitleAbstractAdditional","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleAbstractAdditional","sType":"1NE nQ{}TitleAbstractAdditional","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:description","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}description ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"459","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"460","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"461","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"461"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"463","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"463"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"12","prec":"0","seq":"28","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"450","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"TitleAbstract","prio":"0","matches":"NE nQ{}TitleAbstract","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleAbstract","sType":"1NE nQ{}TitleAbstract","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:description","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}description ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"451","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"452","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"453","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"453"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"455","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"455"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"13","prec":"0","seq":"27","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"441","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"TitleAdditional","prio":"0","matches":"NE nQ{}TitleAdditional","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleAdditional","sType":"1NE nQ{}TitleAdditional","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:title","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}title ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"442","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"443","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"444","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"444"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"446","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"446"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"14","prec":"0","seq":"26","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"432","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"TitleMain","prio":"0","matches":"NE nQ{}TitleMain","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}TitleMain","sType":"1NE nQ{}TitleMain","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:title","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}title ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"433","C":[{"N":"sequence","sType":"*N ","C":[{"N":"att","name":"xml:lang","sType":"1NA ","nsuri":"http://www.w3.org/XML/1998/namespace","line":"434","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"valueOf","sType":"1NT ","flags":"l","line":"435","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Language","name":"attribute","nodeTest":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"435"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"437","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}Value","name":"attribute","nodeTest":"*NA nQ{}Value","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"437"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]}]}]},{"N":"templateRule","rank":"15","prec":"0","seq":"25","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"395","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Coverage","prio":"0","matches":"NE nQ{}Coverage","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Coverage","sType":"1NE nQ{}Coverage","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"dc:coverage","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}coverage ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"396","C":[{"N":"let","var":"Q{}geolocation","slot":"0","sType":"* ","line":"402","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"402","C":[{"N":"str","val":"SOUTH-BOUND LATITUDE: "},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}YMin"}]}]},{"N":"str","val":" * WEST-BOUND LONGITUDE: "},{"N":"atomSing","diag":"0|3||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}XMin"}]}]},{"N":"str","val":" * NORTH-BOUND LATITUDE: "},{"N":"atomSing","diag":"0|5||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}YMax"}]}]},{"N":"str","val":" * EAST-BOUND LONGITUDE: "},{"N":"atomSing","diag":"0|7||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}XMax"}]}]}]},{"N":"sequence","sType":"? ","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"403","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"varRef","sType":"*","name":"Q{}geolocation","slot":"0","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"403"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"choose","sType":"? ","line":"406","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"406","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ElevationMin"},{"N":"str","val":""}]},{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ElevationMax"},{"N":"str","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"407","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"407","C":[{"N":"str","val":" * ELEVATION MIN: "},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ElevationMin"}]}]},{"N":"str","val":" * ELEVATION MAX: "},{"N":"atomSing","diag":"0|3||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ElevationMax"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"409","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"409","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ElevationAbsolut"},{"N":"str","val":""}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"410","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"410","C":[{"N":"str","val":" * ELEVATION ABSOLUT: "},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}ElevationAbsolut"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"414","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"414","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}DepthMin"},{"N":"str","val":""}]},{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}DepthMax"},{"N":"str","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"415","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"415","C":[{"N":"str","val":" * DEPTH MIN: "},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}DepthMin"}]}]},{"N":"str","val":" * DEPTH MAX: "},{"N":"atomSing","diag":"0|3||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}DepthMax"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"417","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"417","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}DepthAbsolut"},{"N":"str","val":""}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"418","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"418","C":[{"N":"str","val":" * DEPTH ABSOLUT: "},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}DepthAbsolut"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"422","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"422","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}TimeMin"},{"N":"str","val":""}]},{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}TimeMax"},{"N":"str","val":""}]}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"423","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"423","C":[{"N":"str","val":" * TIME MIN: "},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}TimeMin"}]}]},{"N":"str","val":" * TIME MAX: "},{"N":"atomSing","diag":"0|3||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}TimeMax"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"choose","sType":"? ","line":"425","C":[{"N":"gc10","op":"!=","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"425","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}TimeAbsolut"},{"N":"str","val":""}]},{"N":"valueOf","flags":"l","sType":"1NT ","line":"426","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"fn","name":"concat","sType":"1AS","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"426","C":[{"N":"str","val":" * TIME ABSOLUT: "},{"N":"atomSing","diag":"0|1||concat","card":"?","C":[{"N":"first","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}TimeAbsolut"}]}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]}]},{"N":"templateRule","rank":"16","prec":"0","seq":"24","ns":"xml=~ =http://www.openarchives.org/OAI/2.0/ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","minImp":"0","flags":"s","slots":"200","baseUri":"file:///home/administrator/api/datasetxml2oai-pmh.xslt","line":"328","module":"datasetxml2oai-pmh.xslt","expand-text":"false","match":"Rdr_Dataset","prio":"0","matches":"NE nQ{}Rdr_Dataset","C":[{"N":"p.nodeTest","role":"match","test":"NE nQ{}Rdr_Dataset","sType":"1NE nQ{}Rdr_Dataset","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ "},{"N":"elem","name":"oai_dc:dc","sType":"1NE nQ{http://www.openarchives.org/OAI/2.0/oai_dc/}dc ","nsuri":"http://www.openarchives.org/OAI/2.0/oai_dc/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","role":"action","line":"329","C":[{"N":"sequence","sType":"* ","C":[{"N":"att","name":"xsi:schemaLocation","nsuri":"http://www.w3.org/2001/XMLSchema-instance","sType":"1NA ","C":[{"N":"str","sType":"1AS ","val":"http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd"}]},{"N":"applyT","sType":"* ","line":"331","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleMain","sType":"*NE nQ{}TitleMain","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"331"}]},{"N":"applyT","sType":"* ","line":"333","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleAdditional","sType":"*NE nQ{}TitleAdditional","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"333"}]},{"N":"choose","sType":"* ","type":"item()*","line":"336","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PersonAuthor","sType":"*NE nQ{}PersonAuthor","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"337"},{"N":"applyT","sType":"* ","line":"338","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PersonAuthor","sType":"*NE nQ{}PersonAuthor","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"338"}]},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}CreatingCorporation","sType":"*NA nQ{}CreatingCorporation","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"340"},{"N":"elem","name":"dc:creator","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}creator ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"341","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"342","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}CreatingCorporation","name":"attribute","nodeTest":"*NA nQ{}CreatingCorporation","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"342"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"applyT","sType":"* ","line":"347","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Subject","sType":"*NE nQ{}Subject","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"347"}]},{"N":"applyT","sType":"* ","line":"349","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleAbstract","sType":"*NE nQ{}TitleAbstract","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"349"}]},{"N":"applyT","sType":"* ","line":"351","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}TitleAbstractAdditional","sType":"*NE nQ{}TitleAbstractAdditional","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"351"}]},{"N":"elem","name":"dc:publisher","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}publisher ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"353","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"355","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}CreatingCorporation","name":"attribute","nodeTest":"*NA nQ{}CreatingCorporation","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"355"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"applyT","sType":"* ","line":"359","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}PersonContributor","sType":"*NE nQ{}PersonContributor","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"359"}]},{"N":"callT","bSlot":"3","sType":"* ","name":"Q{}RdrDate","line":"361"},{"N":"applyT","sType":"* ","line":"363","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate","sType":"*NE nQ{}EmbargoDate","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"363"}]},{"N":"elem","name":"dc:type","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}type ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"366","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"Dataset"}]}]},{"N":"applyT","sType":"* ","line":"368","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"docOrder","sType":"*NA nQ{}MimeType","role":"select","line":"368","C":[{"N":"slash","op":"/","sType":"*NA nQ{}MimeType","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}File"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}MimeType"}]}]}]},{"N":"applyT","sType":"* ","line":"370","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}File","sType":"*NE nQ{}File","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"370"}]},{"N":"elem","name":"dc:identifier","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}identifier ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"375","C":[{"N":"valueOf","flags":"l","sType":"1NT ","line":"376","C":[{"N":"fn","name":"string-join","role":"select","C":[{"N":"first","C":[{"N":"forEach","sType":"*AS ","C":[{"N":"data","sType":"*A ","C":[{"N":"mergeAdj","C":[{"N":"axis","sType":"*NA nQ{}landingpage","name":"attribute","nodeTest":"*NA nQ{}landingpage","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"376"}]}]},{"N":"fn","name":"string","sType":"1AS ","C":[{"N":"dot"}]}]}]},{"N":"str","sType":"1AS ","val":" "}]}]}]},{"N":"applyT","sType":"* ","line":"379","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}Language","sType":"*NA nQ{}Language","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"379"}]},{"N":"choose","sType":"* ","line":"381","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Identifier","sType":"*NE nQ{}Identifier","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"381"},{"N":"applyT","sType":"* ","line":"382","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Identifier","sType":"*NE nQ{}Identifier","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"382"}]},{"N":"true"},{"N":"empty","sType":"0 "}]},{"N":"applyT","sType":"* ","line":"384","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Reference","sType":"*NE nQ{}Reference","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"384"}]},{"N":"applyT","sType":"* ","line":"386","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Coverage","sType":"*NE nQ{}Coverage","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"386"}]},{"N":"applyT","sType":"* ","line":"388","mode":"Q{}oai_dc","bSlot":"2","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}Licence","sType":"*NE nQ{}Licence","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","role":"select","line":"388"}]},{"N":"choose","sType":"? ","line":"389","C":[{"N":"and","sType":"1AB","ns":"= xml=~ fn=~ xsl=~ xsi=~ dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/ ","line":"389","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate"},{"N":"gc10","op":"<","comp":"GAC|http://www.w3.org/2005/xpath-functions/collation/codepoint","card":"1:1","C":[{"N":"gVarRef","name":"Q{}unixTimestamp","bSlot":"1"},{"N":"slash","op":"/","C":[{"N":"axis","name":"child","nodeTest":"*NE nQ{}EmbargoDate"},{"N":"axis","name":"attribute","nodeTest":"*NA nQ{}UnixTimestamp"}]}]}]},{"N":"elem","name":"dc:rights","sType":"1NE nQ{http://purl.org/dc/elements/1.1/}rights ","nsuri":"http://purl.org/dc/elements/1.1/","namespaces":"=http://www.openarchives.org/OAI/2.0/ xsi=http://www.w3.org/2001/XMLSchema-instance dc=http://purl.org/dc/elements/1.1/ oai_dc=http://www.openarchives.org/OAI/2.0/oai_dc/","line":"390","C":[{"N":"valueOf","sType":"1NT ","C":[{"N":"str","sType":"1AS ","val":"embargo"}]}]},{"N":"true"},{"N":"empty","sType":"0 "}]}]}]}]}]}]},{"N":"overridden"},{"N":"output","C":[{"N":"property","name":"Q{http://saxon.sf.net/}stylesheet-version","value":"10"},{"N":"property","name":"method","value":"xml"},{"N":"property","name":"indent","value":"yes"},{"N":"property","name":"encoding","value":"utf-8"}]},{"N":"decimalFormat"}],"Σ":"946a4ddc"} \ No newline at end of file diff --git a/src/controllers/home.controller.js b/src/controllers/home.controller.js new file mode 100644 index 0000000..a1e9983 --- /dev/null +++ b/src/controllers/home.controller.js @@ -0,0 +1,77 @@ +import sequelizeConnection from "../config/db.config"; +import dbContext from "../models/init-models.js"; +import Sequelize from "sequelize"; +const Op = Sequelize.Op; +import { Person } from "../models/init-models.js"; + +export async function findYears(req, res) { + const serverState = "published"; + // Use raw SQL queries to select all cars which belongs to the user + const datasets = await sequelizeConnection.query( + "SELECT distinct EXTRACT(YEAR FROM server_date_published) as published_date FROM gba.documents WHERE server_state = (:serverState)", + { + replacements: { serverState: serverState }, + type: sequelizeConnection.QueryTypes.SELECT, + // attributes: [[sequelizeConnection.fn('DISTINCT', sequelizeConnection.col('published_date')), 'alias_name']], + }, + ); + // Pluck the ids of the cars + const years = datasets.map((dataset) => dataset.published_date); + // check if the cars is returned + if (years.length > 0) { + return res.status(200).json(years); + } +} + +export async function findDocumentsPerYear(req, res) { + const year = req.params.year; + const from = parseInt(year); + const serverState = "published"; + + const conditions = { + [Op.and]: [ + { + server_state: `${serverState}`, + }, + { + [Op.eq]: sequelizeConnection.where( + sequelizeConnection.fn("date_part", "year", sequelizeConnection.col("server_date_published")), + from, + ), + // [Op.eq]: sequelizeConnection.where(sequelizeConnection.fn('date', sequelizeConnection.col('server_date_published')), '>=', fromYear) + }, + ], + }; + + dbContext.Dataset.findAll({ + attributes: [ + "publish_id", + "server_date_published", + [sequelizeConnection.fn("date_part", "year", sequelizeConnection.col("server_date_published")), "pub_year"], + ], + where: conditions, + include: [ + "titles", + { + model: Person, + through: { where: { role: "author" } }, + as: "authors", + }, + ], + order: ["server_date_published"], + }) + .then((data) => { + res.send(data); + }) + .catch((err) => { + res.status(500).send({ + message: err.message || "Some error occurred while retrieving datasets.", + }); + }); +} + +// function sendToElasticAndLogToConsole(sql, queryObject) { +// // save the `sql` query in Elasticsearch +// console.log(sql); +// // use the queryObject if needed (e.g. for debugging) +// } diff --git a/src/controllers/oai.controller.ts b/src/controllers/oai.controller.ts new file mode 100644 index 0000000..73435d2 --- /dev/null +++ b/src/controllers/oai.controller.ts @@ -0,0 +1,738 @@ +import { Controller, Get } from "@overnightjs/core"; +import Sequelize from "sequelize"; +import { NextFunction, Request, Response } from "express"; +import { StatusCodes } from "http-status-codes"; +import { create } from "xmlbuilder2"; +import { XMLBuilder } from "xmlbuilder2/lib/interfaces"; +import { readFileSync } from "fs"; +// @ts-ignore +import { transform } from "saxon-js"; +import dayjs, { Dayjs, OpUnitType } from "dayjs"; +import { Dataset, Project, License } from "../models/init-models"; +import Logger from "jet-logger"; +import { BadOaiModelException, OaiModelException } from "../exceptions/OaiModelException"; +import PageNotFoundException from "../exceptions/PageNotFoundException"; +import { OaiErrorCodes } from "../exceptions/OaiErrorCodes"; +import XmlModel from "../library/XmlModel"; +import Configuration from "../library/oai/OaiConfiguration"; +import ResumptionToken from "../library/oai/ResumptionToken"; +import TokenWorker from "../library/oai/TokenWorker"; + +interface XslTParameter { + [key: string]: any; +} +interface OaiParameter { + [key: string]: any; +} +interface IDictionary { + [index: string]: string; +} + +function preg_match(regex: RegExp, str: string) { + const result: boolean = regex.test(str); + return result; +} + +@Controller("oai") +export class OaiController { + private deliveringDocumentStates = ["published", "deleted"]; + private sampleRegEx = /^[A-Za-zäüÄÜß0-9\-_.!~]+$/; + private xsltParameter: XslTParameter; + private configuration: Configuration; + private tokenWorker: TokenWorker; + + /** + * Holds xml representation of document information to be processed. + * + * @var xmlbuilder.XMLDocument | null Defaults to null. + */ + private xml: XMLBuilder; + + private proc; + + constructor() { + this.proc = readFileSync(__dirname + "/datasetxml2oai.sef.json"); + this.configuration = new Configuration(); + } + + @Get("") + public async index(request: Request, response: Response, next: NextFunction) { + this.xml = create( + { version: "1.0", encoding: "UTF-8", standalone: true }, + "", + // { + // keepNullNodes: false, + // keepNullAttributes: false, + // headless: false, + // ignoreDecorators: false, + // separateArrayItems: false, + // noDoubleEncoding: false, + // noValidation: false, + // invalidCharReplacement: undefined, + // stringify: {}, + // }, + ); + + // this.proc = new XSLTProcessor(); + // const stylesheet = readFileSync(__dirname + "/datasetxml2oai.sef.json"); + const xsltParameter = (this.xsltParameter = {}); + + let earliestDateFromDb; + const firstPublishedDataset: Dataset | null = await Dataset.earliestPublicationDate(); + firstPublishedDataset != null && + (earliestDateFromDb = dayjs(firstPublishedDataset.server_date_published).format("YYYY-MM-DDThh:mm:ss[Z]")); + this.xsltParameter["earliestDatestamp"] = earliestDateFromDb; + + const oaiRequest: OaiParameter = request.query; + try { + await this.handleRequest(oaiRequest, request); + } catch (error) { + // return next(error); + if (error instanceof OaiModelException) { + this.xsltParameter["oai_error_code"] = error.oaiCode; + this.xsltParameter["oai_error_message"] = error.message; + } else { + // return next(error); // passing to default express middleware error handler + this.xsltParameter["oai_error_code"] = "unknown"; + this.xsltParameter["oai_error_message"] = "An internal error occured."; + } + } + // catch (error) { // manually catching + // return next(error); // passing to default express middleware error handler + // } + const xmlString = this.xml.end({ prettyPrint: true }); + + // let data = await transform({ + // stylesheetText: stylesheet, + // // stylesheetBaseURI: "my-stylesheet.sef.json", + // sourceText: xmlString, + // destination: "serialized" + // }); + // .then((data: any) => { + // response.writeHead(200, {'Content-Type': 'application/xml'}); + // response.write(data.principalResult); + // response.end(); + // }); + let xmlOutput; + try { + const result = await transform({ + // stylesheetFileName: `${config.TMP_BASE_DIR}/data-quality/rules/iati.sef.json`, + stylesheetText: this.proc, + destination: "serialized", + // sourceFileName: sourceFile, + sourceText: xmlString, + stylesheetParams: xsltParameter, + // logLevel: 10, + }); + xmlOutput = result.principalResult; + } catch (error) { + // return next(error); + // if (error instanceof OaiModelException) { + // this.xsltParameter["oai_error_code"] = error.oaiCode; + // this.xsltParameter["oai_error_message"] = error.message; + // } else { + // // return next(error); // passing to default express middleware error handler + // this.xsltParameter["oai_error_code"] = "unknown"; + // this.xsltParameter["oai_error_message"] = "An internal error occured."; + // } + return next(error); + } + + response + .header("Content-Type", "application/xml") + .header("Access-Control-Allow-Origin", "*") + .header("Access-Control-Allow-Methods", "GET,POST"); + response.status(StatusCodes.OK).send(xmlOutput); + // response.end(); + } + + protected async handleRequest(oaiRequest: OaiParameter, request: Request) { + // Setup stylesheet + // $this->loadStyleSheet('datasetxml2oai-pmh.xslt'); + + // Set response time + const now: dayjs.Dayjs = dayjs(); + this.xsltParameter["responseDate"] = now.format("YYYY-MM-DDThh:mm:ss[Z]"); + this.xsltParameter["unixTimestamp"] = now.unix(); + + // set OAI base url + const baseDomain = process.env.BASE_DOMAIN || "localhost"; + this.xsltParameter["baseURL"] = baseDomain + "/oai"; + this.xsltParameter["repURL"] = request.protocol + "://" + request.get("host"); + this.xsltParameter["downloadLink"] = request.protocol + "://" + request.get("host") + "/file/download/"; + this.xsltParameter["doiLink"] = "https://doi.org/"; + this.xsltParameter["doiPrefix"] = "info:eu-repo/semantics/altIdentifier/doi/"; + + if (oaiRequest["verb"]) { + const verb = oaiRequest["verb"]; + this.xsltParameter["oai_verb"] = verb; + if (verb == "Identify") { + this.handleIdentify(); + } else if (verb == "ListMetadataFormats") { + this.handleListMetadataFormats(); + } else if (verb == "GetRecord") { + await this.handleGetRecord(oaiRequest); + } else if (verb == "ListRecords") { + await this.handleListRecords(oaiRequest); + } else if (verb == "ListIdentifiers") { + await this.handleListIdentifiers(oaiRequest); + } else if (verb == "ListSets") { + await this.handleListSets(); + } else { + this.handleIllegalVerb(); + } + } else { + // const err = new HttpException(404, 'Not Found') + // next(err); + + // try { + // console.log("Async code example.") + // const err = new HttpException(404, 'Not Found'); + const err = new PageNotFoundException("verb not found"); + throw err; + // } catch (error) { // manually catching + // next(error); // passing to default middleware error handler + // } + } + } + + protected handleIdentify() { + const email = "repository@geologie.ac.at"; + const repositoryName = "Tethys RDR"; + const repIdentifier = "tethys.at"; + const sampleIdentifier = "oai:" + repIdentifier + ":1"; //$this->_configuration->getSampleIdentifier(); + + // Dataset::earliestPublicationDate()->server_date_published->format('Y-m-d\TH:i:s\Z') : null; + // earliestDateFromDb!= null && (this.xsltParameter['earliestDatestamp'] = earliestDateFromDb?.server_date_published); + + // set parameters for oai-pmh.xslt + this.xsltParameter["email"] = email; + this.xsltParameter["repositoryName"] = repositoryName; + this.xsltParameter["repIdentifier"] = repIdentifier; + this.xsltParameter["sampleIdentifier"] = sampleIdentifier; + // $this->proc->setParameter('', 'earliestDatestamp', $earliestDateFromDb); + + this.xml.root().ele("Datasets"); + } + + /** + * Implements response for OAI-PMH verb 'ListMetadataFormats'. + * + * @param array &$oaiRequest Contains full request information + * @return void + */ + protected handleListMetadataFormats() { + this.xml.root().ele("Datasets"); + } + + protected async handleListSets() { + const repIdentifier = "tethys.at"; + this.xsltParameter["repIdentifier"] = repIdentifier; + const datasetElement = this.xml.root().ele("Datasets"); + + const sets: { [key: string]: string } = { + open_access: "Set for open access licenses", + // 'bibliography:true' => 'Set for bibliographic entries', + // 'bibliography:false' => 'Set for non-bibliographic entries', + ...(await this.getSetsForDatasetTypes()), + // ... await this.getSetsForProjects(), + } as IDictionary; + + for (const [key, value] of Object.entries(sets)) { + const setElement = datasetElement.ele("Rdr_Sets"); + setElement.att("Type", key); + setElement.att("TypeName", value); + } + } + + protected async handleGetRecord(oaiRequest: OaiParameter) { + // GetRecord&metadataPrefix=oai_dc&identifier=oai:tethys.at:1 + + const repIdentifier = "tethys.at"; + this.xsltParameter["repIdentifier"] = repIdentifier; + + // Identifier references metadata Urn, not plain Id! + // Currently implemented as 'oai:foo.bar.de:{docId}' or 'urn:nbn...-123' + if (!("identifier" in oaiRequest)) { + // throw new BadOaiModelException('The prefix of the identifier argument is unknown.'); + throw new BadOaiModelException("The prefix of the identifier argument is unknown."); + } + const dataId = Number(this.getDocumentIdByIdentifier(oaiRequest.identifier)); + + // let dataset: Dataset | null; + + const dataset = await Dataset.findOne({ + where: { publish_id: dataId }, + include: ["xmlCache"], + // order: ['server_date_published'], + }); + if (!dataset || !dataset.publish_id) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + "The value of the identifier argument is unknown or illegal in this repository.", + OaiErrorCodes.IDDOESNOTEXIST, + ); + } + + let metadataPrefix = null; + if ("metadataPrefix" in oaiRequest) { + metadataPrefix = oaiRequest["metadataPrefix"]; + } else { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + "The prefix of the metadata argument is unknown.", + OaiErrorCodes.BADARGUMENT, + ); + } + this.xsltParameter["oai_metadataPrefix"] = metadataPrefix; + + // do not deliver datasets which are restricted by document state + + if (dataset.server_state == null || !this.deliveringDocumentStates.includes(dataset.server_state)) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + "Document is not available for OAI export!", + OaiErrorCodes.NORECORDSMATCH, + ); + } + + // add xml elements + const datasetNode = this.xml.root().ele("Datasets"); + + await this.createXmlRecord(dataset, datasetNode); + // let domNode = await this.getDatasetXmlDomNode(dataset); + // // add frontdoor url + // // dataset.publish_id = dataset.publish_id != null ? dataset.publish_id : 0; + // this.addLandingPageAttribute(domNode, dataset.publish_id.toString()); + // this.addSpecInformation(domNode, "data-type:" + dataset.type); + // datasetNode.import(domNode); + } + + /** + * Implements response for OAI-PMH verb 'ListRecords'. + * + * @param array &$oaiRequest Contains full request information + * @return void + */ + protected async handleListRecords(oaiRequest: OaiParameter) { + if (!this.tokenWorker) { + this.tokenWorker = new TokenWorker(86400); + } + !this.tokenWorker.Connected && (await this.tokenWorker.connect()); + + //$maxRecords = 30; //$this->_configuration->getMaxListRecords(); + const maxRecords = this.configuration.maxListRecs; + await this.handlingOfLists(oaiRequest, maxRecords); + + await this.tokenWorker.close(); + } + + /** + * Implements response for OAI-PMH verb 'ListIdentifiers'. + * + * @param array &$oaiRequest Contains full request information + * @return void + */ + protected async handleListIdentifiers(oaiRequest: OaiParameter) { + // if ("resumptionToken" in oaiRequest) { + if (!this.tokenWorker) { + this.tokenWorker = new TokenWorker(86400); + } + !this.tokenWorker.Connected && (await this.tokenWorker.connect()); + + //$maxIdentifier = 5; //$this->_configuration->getMaxListIdentifiers(); + const maxIdentifier = this.configuration.maxListIds; //->getMaxListIdentifiers(); + await this.handlingOfLists(oaiRequest, maxIdentifier); + + await this.tokenWorker.close(); + } + + private async handlingOfLists(oaiRequest: OaiParameter, maxRecords: number) { + if (!maxRecords) { + maxRecords = 100; + } + const repIdentifier = "tethys.at"; + // //$this->_configuration->getResumptionTokenPath(); + // $tokenTempPath = storage_path('app' . DIRECTORY_SEPARATOR . 'resumption'); + + this.xsltParameter["repIdentifier"] = repIdentifier; + const datasetNode = this.xml.root().ele("Datasets"); + + // // do some initialisation + let cursor = 0; + let totalIds = 0; + let start = maxRecords + 1; + let reldocIds: (number | null)[] = []; + + let metadataPrefix = null; + + // const tokenWorker = new TokenWorker(86400); + // await tokenWorker.connect(); + // $tokenWorker->setResumptionPath($tokenTempPath); + // const url = process.env.REDIS_URL || "redis://redis:6379"; + // const redisClient = createClient({ + // url + // }); + // redisClient.on('error', (error) => { + // const err = new InternalServerErrorException("Error occured while connecting or accessing redis server'"); + // throw err; + // }); + + // resumptionToken is defined + if ("resumptionToken" in oaiRequest) { + const resParam = oaiRequest["resumptionToken"]; //e.g. "158886496600000" + // let token = await tokenWorker.getResumptionToken(resParam); + const token = await this.tokenWorker.get(resParam); + + if (!token) { + throw new OaiModelException(StatusCodes.INTERNAL_SERVER_ERROR, "cache is outdated.", OaiErrorCodes.BADRESUMPTIONTOKEN); + } + + cursor = token.StartPosition - 1; //startet dann bei Index 10 + start = token.StartPosition + maxRecords; + totalIds = token.TotalIds; + reldocIds = token.DocumentIds; + metadataPrefix = token.MetadataPrefix; + + this.xsltParameter["oai_metadataPrefix"] = metadataPrefix; + } else { + // no resumptionToken is given + if ("metadataPrefix" in oaiRequest) { + metadataPrefix = oaiRequest["metadataPrefix"]; + } else { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + "The prefix of the metadata argument is unknown.", + OaiErrorCodes.BADARGUMENT, + ); + } + this.xsltParameter["oai_metadataPrefix"] = metadataPrefix; + + // add server state restrictions + const includeArray: Array = []; + const andArray: Array = new Array({ + server_state: { + [Sequelize.Op.in]: this.deliveringDocumentStates, + }, + }); + // andArray.push({ + // server_state: { + // [Sequelize.Op.in]: this.deliveringDocumentStates, + // }, + // }); + if ("set" in oaiRequest) { + const set = oaiRequest["set"] as string; + const setArray = set.split(":"); + if (setArray[0] == "data-type") { + if (setArray.length == 2 && setArray[1]) { + andArray.push({ + type: { + [Sequelize.Op.eq]: setArray[1], + }, + }); + } + } else if (setArray[0] == "open_access") { + const openAccessLicences = ["CC-BY-4.0", "CC-BY-SA-4.0"]; + let icncludeFilter = { + model: License, + as: "licenses", + required: true, //return only records which have an associated model INNER JOIN + where: { + name: { + [Sequelize.Op.in]: openAccessLicences, + }, + }, + }; + includeArray.push(icncludeFilter); + } + } + + // &from=2020-09-03&until2020-09-03 + // &from=2020-09-11&until=2021-05-11 + if ("from" in oaiRequest && "until" in oaiRequest) { + const from = oaiRequest["from"] as string; + let fromDate = dayjs(from); + const until = oaiRequest["until"] as string; + let untilDate = dayjs(until); + if (from.length != until.length) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + "The request has different granularities for the from and until parameters.", + OaiErrorCodes.BADARGUMENT, + ); + } + fromDate.hour() == 0 && (fromDate = fromDate.startOf("day")); + untilDate.hour() == 0 && (untilDate = untilDate.endOf("day")); + + andArray.push({ + server_date_published: { + // [Sequelize.Op.between]: [fromDate, untilDate] + [Sequelize.Op.and]: { + [Sequelize.Op.gte]: fromDate.format("YYYY-MM-DD HH:mm:ss"), + [Sequelize.Op.lte]: untilDate.format("YYYY-MM-DD HH:mm:ss"), + }, + }, + }); + } else if ("from" in oaiRequest && !("until" in oaiRequest)) { + const from = oaiRequest["from"] as string; + let fromDate = dayjs(from); + fromDate.hour() == 0 && (fromDate = fromDate.startOf("day")); + + const now = dayjs(); + if (fromDate.isAfter(now)) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + "Given from date is greater than now. The given values results in an empty list.", + OaiErrorCodes.NORECORDSMATCH, + ); + } else { + // $finder->where('server_date_published', '>=', $fromDate); + andArray.push({ + server_date_published: { + [Sequelize.Op.gte]: fromDate.format("YYYY-MM-DD HH:mm:ss"), + }, + }); + } + } else if (!("from" in oaiRequest) && "until" in oaiRequest) { + const until = oaiRequest["until"] as string; + let untilDate = dayjs(until); + untilDate.hour() == 0 && (untilDate = untilDate.endOf("day")); + + const firstPublishedDataset: Dataset = (await Dataset.earliestPublicationDate()) as Dataset; + const earliestPublicationDate = dayjs(firstPublishedDataset.server_date_published); //format("YYYY-MM-DDThh:mm:ss[Z]")); + if (earliestPublicationDate.isAfter(untilDate)) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + `earliestDatestamp is greater than given until date. + The given values results in an empty list.`, + OaiErrorCodes.NORECORDSMATCH, + ); + } else { + // $finder->where('server_date_published', '<=', $untilDate); + andArray.push({ + server_date_published: { + [Sequelize.Op.lte]: untilDate.format("YYYY-MM-DD HH:mm:ss"), + }, + }); + } + } + + reldocIds = ( + await Dataset.findAll({ + attributes: ["publish_id"], + where: andArray, + order: ["publish_id"], + include: includeArray, + raw: true, + // logging: (sql, queryObject) => { + // const test = sql; + // }, + }) + ).map((dat) => dat.publish_id); + // reldocIds = await Dataset.findAll({ + // // attributes: ["publish_id"], + // where: andArray, + // include: ["xmlCache"], + // order: ["server_date_published"], + + // // logging: (sql, queryObject) => { + // // const test = sql; + // // }, + // }); + totalIds = reldocIds.length; //184 + } //else resumptionToekn + + // // handling of document ids + const restIds = reldocIds as number[]; + const workIds = restIds.splice(0, maxRecords) as number[]; // array_splice(restIds, 0, maxRecords); + + // no records returned + if (workIds.length == 0) { + // await tokenWorker.close(); + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + "The combination of the given values results in an empty list.", + OaiErrorCodes.NORECORDSMATCH, + ); + } + + //foreach ($datasets as $dataset) + const datasets: Dataset[] = await Dataset.findAll({ + // attributes: ["publish_id"], + where: { + publish_id: { + [Sequelize.Op.in]: workIds, + }, + }, + include: ["xmlCache"], + order: ["publish_id"], + }); + for (const dataset of datasets) { + // let dataset = Dataset.findOne({ + // where: {'publish_id': dataId} + // }); + await this.createXmlRecord(dataset, datasetNode); + } + + // store the further Ids in a resumption-file + const countRestIds = restIds.length; //84 + if (countRestIds > 0) { + const token = new ResumptionToken(); + token.StartPosition = start; //101 + token.TotalIds = totalIds; //184 + token.DocumentIds = restIds; //101 -184 + token.MetadataPrefix = metadataPrefix; + + // $tokenWorker->storeResumptionToken($token); + const res = await this.tokenWorker.set(token); + + // set parameters for the resumptionToken-node + // const res = token.ResumptionId; + this.setParamResumption(res, cursor, totalIds); + } + } + + /** + * Set parameters for resumptionToken-line. + * + * @param string $res value of the resumptionToken + * @param int $cursor value of the cursor + * @param int $totalIds value of the total Ids + */ + private setParamResumption(res: string, cursor: number, totalIds: number) { + const tomorrow = dayjs().add(1, "day").format("YYYY-MM-DDThh:mm:ss[Z]"); + this.xsltParameter["dateDelete"] = tomorrow; + this.xsltParameter["res"] = res; + this.xsltParameter["cursor"] = cursor; + this.xsltParameter["totalIds"] = totalIds; + } + + private addSpecInformation(domNode: XMLBuilder, information: string) { + domNode.ele("SetSpec").att("Value", information); + } + + private addLandingPageAttribute(domNode: XMLBuilder, dataid: string) { + const baseDomain = process.env.BASE_DOMAIN || "localhost"; + const url = "https://" + this.getDomain(baseDomain) + "/dataset/" + dataid; + // add attribute du dataset xml element + domNode.att("landingpage", url); + } + + private getDomain(host: string): string { + // $myhost = strtolower(trim($host)); + let myHost: string = host.trim().toLocaleLowerCase(); + // $count = substr_count($myhost, '.'); + const count: number = myHost.split(",").length - 1; + + if (count == 2) { + const words = myHost.split("."); + if (words[1].length > 3) { + myHost = myHost.split(".", 2)[1]; + } + } else if (count > 2) { + myHost = this.getDomain(myHost.split(".", 2)[1]); + } + myHost = myHost.replace(new RegExp(/^.*:\/\//i, "g"), ""); + return myHost; + } + + private getDocumentIdByIdentifier(oaiIdentifier: string): string { + const identifierParts: string[] = oaiIdentifier.split(":"); // explode(":", $oaiIdentifier); + const dataId: string = identifierParts[2]; + // switch (identifierParts[0]) { + // case 'oai': + // if (isset($identifierParts[2])) { + // $dataId = $identifierParts[2]; + // } + // break; + // default: + // throw new OaiModelException( + // 'The prefix of the identifier argument is unknown.', + // OaiModelError::BADARGUMENT + // ); + // break; + // } + + // if (empty($dataId) or !preg_match('/^\d+$/', $dataId)) { + // throw new OaiModelException( + // 'The value of the identifier argument is unknown or illegal in this repository.', + // OaiModelError::IDDOESNOTEXIST + // ); + + return dataId; + } + + private async createXmlRecord(dataset: Dataset, datasetNode: XMLBuilder) { + const domNode = await this.getDatasetXmlDomNode(dataset); + + // add frontdoor url and data-type + // if (dataset.publish_id) { + dataset.publish_id && this.addLandingPageAttribute(domNode, dataset.publish_id.toString()); + // } + this.addSpecInformation(domNode, "data-type:" + dataset.type); + datasetNode.import(domNode); + } + + private async getDatasetXmlDomNode(dataset: Dataset) { + // dataset.fetchValues(); + const xmlModel = new XmlModel(dataset); + // xmlModel.setModel(dataset); + xmlModel.excludeEmptyFields(); + // const cache = dataset.xmlCache ? dataset.xmlCache : new DocumentXmlCache(); + if (dataset.xmlCache) { + xmlModel.setXmlCache = dataset.xmlCache; + } + xmlModel.caching = true; + // return cache.getDomDocument(); + const domDocument = await xmlModel.getDomDocument(); + return domDocument; + } + + private async getSetsForProjects(): Promise { + // const setSpecPattern = this.SET_SPEC_PATTERN; + const sets: { [key: string]: string } = {} as IDictionary; + + const projects: Array = await Project.findAll({ + attributes: ["label"], + raw: true, + }); + projects.forEach((project) => { + if (false == preg_match(this.sampleRegEx, project.label)) { + const msg = `Invalid SetSpec (project='${project.label}'). + Allowed characters are [${this.sampleRegEx}].`; + Logger.err(`OAI: ${msg}`); + // Log::error("OAI-PMH: $msg"); + return; + } + const setSpec = "project:" + project.label; + sets[setSpec] = `Set for project '${project.label}'`; + }); + return sets; + } + + private async getSetsForDatasetTypes(): Promise { + const sets: { [key: string]: string } = {} as IDictionary; + + const datasets: Array = await Dataset.findAll({ + attributes: ["type"], + where: { server_state: { [Sequelize.Op.eq]: "published" } }, + }); + datasets.forEach((dataset) => { + if (dataset.type && false == preg_match(this.sampleRegEx, dataset.type)) { + const msg = `Invalid SetSpec (data-type='${dataset.type}'). + Allowed characters are [${this.sampleRegEx}].`; + Logger.err(`OAI: ${msg}`); + // Log::error("OAI-PMH: $msg"); + return; + } + const setSpec = "data-type:" + dataset.type; + sets[setSpec] = `Set for document type '${dataset.type}'`; + }); + return sets; + } + + private handleIllegalVerb() { + this.xsltParameter["oai_error_code"] = "badVerb"; + this.xsltParameter["oai_error_message"] = "The verb provided in the request is illegal."; + } +} diff --git a/src/exceptions/BadRequest.ts b/src/exceptions/BadRequest.ts new file mode 100644 index 0000000..4ce1dbe --- /dev/null +++ b/src/exceptions/BadRequest.ts @@ -0,0 +1,11 @@ +import { StatusCodes } from "http-status-codes"; +import HTTPException from "./HttpException"; + +class BadRequestException extends HTTPException { + constructor(message?: string) { + super(StatusCodes.BAD_REQUEST, message || "bad Request"); + this.stack = ""; + } +} + +export default BadRequestException; diff --git a/src/exceptions/HttpException.ts b/src/exceptions/HttpException.ts new file mode 100644 index 0000000..7bad1b0 --- /dev/null +++ b/src/exceptions/HttpException.ts @@ -0,0 +1,12 @@ +class HTTPException extends Error { + public status: number; + public message: string; + + constructor(status: number, message: string) { + super(message); + this.status = status; + this.message = message; + } +} + +export default HTTPException; diff --git a/src/exceptions/InternalServerError.ts b/src/exceptions/InternalServerError.ts new file mode 100644 index 0000000..dbc6b20 --- /dev/null +++ b/src/exceptions/InternalServerError.ts @@ -0,0 +1,11 @@ +import { StatusCodes } from "http-status-codes"; +import HTTPException from "./HttpException"; + +class InternalServerErrorException extends HTTPException { + constructor(message?: string) { + super(StatusCodes.INTERNAL_SERVER_ERROR, message || "Server Error"); + this.stack = ""; + } +} + +export default InternalServerErrorException; diff --git a/src/exceptions/OaiErrorCodes.ts b/src/exceptions/OaiErrorCodes.ts new file mode 100644 index 0000000..9842566 --- /dev/null +++ b/src/exceptions/OaiErrorCodes.ts @@ -0,0 +1,11 @@ +export enum OaiErrorCodes { + BADVERB = 1010, + BADARGUMENT = 1011, + CANNOTDISSEMINATEFORMAT = 1012, + BADRESUMPTIONTOKEN = 1013, + NORECORDSMATCH = 1014, + IDDOESNOTEXIST = 1015, +} + +// 👇️ default export +// export { OaiErrorCodes }; diff --git a/src/exceptions/OaiModelException.ts b/src/exceptions/OaiModelException.ts new file mode 100644 index 0000000..ca6a245 --- /dev/null +++ b/src/exceptions/OaiModelException.ts @@ -0,0 +1,77 @@ +import { StatusCodes } from "http-status-codes"; +// import HTTPException from './HttpException'; +import { OaiErrorCodes } from "./OaiErrorCodes"; + +export class ErrorCode { + public static readonly Unauthenticated = "Unauthenticated"; + public static readonly NotFound = "NotFound"; + public static readonly MaximumAllowedGrade = "MaximumAllowedGrade"; + public static readonly AsyncError = "AsyncError"; + public static readonly UnknownError = "UnknownError"; +} + +export class ErrorModel { + /** + * Unique error code which identifies the error. + */ + public code: string; + /** + * Status code of the error. + */ + public status: number; + /** + * Any additional data that is required for translation. + */ + // public metaData?: any; +} + +export class OaiModelException extends Error { + public status: number; + public message: string; + public oaiCode: number; + + // constructor(status: number, message: string) { + // super(message); + // this.status = status; + // this.message = message; + // } + constructor(status: number, message: string, oaiCode: number) { + super(message); + this.status = status; + this.message = message; + this.oaiCode = oaiCode; + } + // constructor(code: string = ErrorCode.UnknownError, message: any = null) { + // super(code); + // Object.setPrototypeOf(this, new.target.prototype); + // this.name = code; + // this.status = 500; + // this.message = message; + // // switch (code) { + // // case ErrorCode.Unauthenticated: + // // this.status = 401; + // // break; + // // case ErrorCode.MaximumAllowedGrade: + // // this.status = 400; + // // break; + // // case ErrorCode.AsyncError: + // // this.status = 400; + // // break; + // // case ErrorCode.NotFound: + // // this.status = 404; + // // break; + // // default: + // // this.status = 500; + // // break; + // // } + // } +} + +export class BadOaiModelException extends OaiModelException { + constructor(message?: string) { + super(StatusCodes.INTERNAL_SERVER_ERROR, message || "bad Request", OaiErrorCodes.BADARGUMENT); + this.stack = ""; + } +} + +// export default OaiModelexception; diff --git a/src/exceptions/PageNotFoundException.ts b/src/exceptions/PageNotFoundException.ts new file mode 100644 index 0000000..6e94ea7 --- /dev/null +++ b/src/exceptions/PageNotFoundException.ts @@ -0,0 +1,11 @@ +import { StatusCodes } from "http-status-codes"; +import HTTPException from "./HttpException"; + +class PageNotFoundException extends HTTPException { + constructor(message?: string) { + super(StatusCodes.NOT_FOUND, message || "Page not found"); + this.stack = ""; + } +} + +export default PageNotFoundException; diff --git a/src/exceptions/error-handler.ts b/src/exceptions/error-handler.ts new file mode 100644 index 0000000..fb52d70 --- /dev/null +++ b/src/exceptions/error-handler.ts @@ -0,0 +1,23 @@ +import { Request, Response } from "express"; +// import { ErrorCode } from './error-code'; +// import { ErrorException } from './error-exception'; +// import { ErrorModel } from './error-model'; +import HTTPException from "./HttpException"; +import { StatusCodes } from "http-status-codes"; +import { OaiModelException } from "./OaiModelException"; + +export const errorHandler = (err: HTTPException | OaiModelException, req: Request, res: Response) => { + console.log("Error handling middleware called."); + console.log("Path:", req.path); + console.error("Error occured:", err); + if (err instanceof HTTPException) { + console.log("Http Error is known."); + res.status(err.status).send(err); + } else if (err instanceof OaiModelException) { + console.log("Oai-Error is known."); + res.status(err.status).send(err); + } else { + // For unhandled errors. + res.status(500).send({ code: StatusCodes.INTERNAL_SERVER_ERROR, status: 500 }); + } +}; diff --git a/src/library/XmlModel.ts b/src/library/XmlModel.ts new file mode 100644 index 0000000..168961a --- /dev/null +++ b/src/library/XmlModel.ts @@ -0,0 +1,184 @@ +import DocumentXmlCache from "../models/DocumentXmlCache"; +// import { XMLDocument } from "xmlbuilder"; +import { XMLBuilder } from "xmlbuilder2/lib/interfaces"; +import Dataset from "../models/Dataset"; +import Logger from "jet-logger"; +import { create } from "xmlbuilder2"; +import dayjs from "dayjs"; + +/** + * This is the description of the interface + * + * @interface Conf + * @member {Model} model holds the current dataset model + * @member {XMLBuilder} dom holds the current DOM representation + */ +export interface Conf { + /** + * Holds the current model either directly set or deserialized from XML. + */ + model: Dataset; + + /** + * Holds the current DOM representation. + */ + dom?: XMLBuilder; + + /** + * List of fields to skip on serialization. + */ + excludeFields: Array; + + /** + * True, if empty fields get excluded from serialization. + */ + excludeEmpty: boolean; + + /** + * Base URI for xlink:ref elements + */ + baseUri: string; +} + +export default class XmlModel { + // private config: { [key: string]: any } = {}; + private config: Conf; // = { excludeEmpty: false, baseUri: "" }; + // private strategy = null; + private cache: DocumentXmlCache; + private _caching = false; + + constructor(dataset: Dataset) { + // $this->strategy = new Strategy();// Opus_Model_Xml_Version1; + // $this->config = new Conf(); + // $this->strategy->setup($this->config); + + // this.strategy = new Strategy(); + this.config = { + excludeEmpty: false, + baseUri: "", + excludeFields: [], + model: dataset, + }; + } + + /** + * Set the Model for XML generation. + * + * @param \App\Models\Dataset model Model to serialize. + * + */ + set setModel(model: Dataset) { + this.config.model = model; + // return this; + } + + /** + * Define that empty fields (value===null) shall be excluded. + * + */ + public excludeEmptyFields(): void { + this.config.excludeEmpty = true; + // return this; + } + + /** + * Return cache table. + * + * @returns {DocumentXmlCache} + */ + get getXmlCache(): DocumentXmlCache { + return this.cache; + } + + /** + * Set a new XML version with current configuration up. + * + * @param { DocumentXmlCache } cache table + */ + set setXmlCache(cache: DocumentXmlCache) { + this.cache = cache; + } + + get caching(): boolean { + return this._caching; + } + set caching(caching: boolean) { + this._caching = caching; + } + + public async getDomDocument() { + const dataset = this.config.model; + + let domDocument: XMLBuilder | null = await this.getDomDocumentFromXmlCache(); + if (domDocument) { + return domDocument; + } else { + //create domDocument during runtime + // domDocument = $this->strategy->getDomDocument(); + domDocument = create({ version: "1.0", encoding: "UTF-8", standalone: true }, ""); + } + + //if caching isn't wanted return only dom Document + if (this._caching != true) { + return domDocument; + //otherwise caching is desired: + // save xml cache to db and return domDocument + } else { + // save new DocumentXmlCache + if (!this.cache) { + this.cache = new DocumentXmlCache(); + this.cache.document_id = dataset.id; + } + // if (!this.cache.document_id) { + // this.cache.document_id = dataset.id; + // } + this.cache.xml_version = 1; // (int)$this->strategy->getVersion(); + this.cache.server_date_modified = dayjs(dataset.server_date_modified).format("YYYY-MM-DD HH:mm:ss"); + this.cache.xml_data = domDocument.end(); + + //save xml cache + this.cache.save(); + // return newly created xml cache + return domDocument; + } + } + + private async getDomDocumentFromXmlCache(): Promise { + const dataset: Dataset = this.config.model; + if (null == this.cache) { + //$logger->debug(__METHOD__ . ' skipping cache for ' . get_class($model)); + // Log::debug(__METHOD__ . ' skipping cache for ' . get_class($dataset)); + Logger.warn(`__METHOD__ . skipping cache for ${dataset}`); + return null; + } + // const dataset: Dataset = this.config.model; + const actuallyCached: boolean = await DocumentXmlCache.hasValidEntry(dataset.id, dataset.server_date_modified); + + //no cache or no actual cache + if (true != actuallyCached) { + Logger.warn(" cache missing for " + "#" + dataset.id); + return null; + } + + //cache is actual return it for oai: + // Log::debug(__METHOD__ . ' cache hit for ' . get_class($dataset) . '#' . $dataset->id); + try { + // return $this->_cache->get($model->getId(), (int) $this->_strategy->getVersion()); + // const cache = await DocumentXmlCache.findOne({ + // where: { document_id: dataset.id }, + // }); + if (this.cache) { + return this.cache.getDomDocument(); + } else { + Logger.warn(" Access to XML cache failed on " + dataset + "#" + dataset.id + ". Trying to recover."); + return null; + } + // return this.cache.getDomDocument(); + } catch (error) { + Logger.warn(" Access to XML cache failed on " + dataset + "#" + dataset.id + ". Trying to recover."); + return null; + } + } +} + +// export default XmlModel; diff --git a/src/library/oai/OaiConfiguration.ts b/src/library/oai/OaiConfiguration.ts new file mode 100644 index 0000000..621dba1 --- /dev/null +++ b/src/library/oai/OaiConfiguration.ts @@ -0,0 +1,71 @@ +import config from "../../config/oai.config"; + +export default class Configuration { + /** + * Hold path where to store temporary resumption token files. + * + * @var string + */ + private _pathTokens = ""; + + private _maxListIds = 15; + + /** + * Return maximum number of listable identifiers per request. + * + * @return {number} Maximum number of listable identifiers per request. + */ + public get maxListIds(): number { + return this._maxListIds; + } + public set maxListIds(value: number) { + this._maxListIds = value; + } + + /** + * Holds maximum number of records to list per request. + * + * @var number + */ + private _maxListRecs = 15; + + /** + * Return maximum number of listable records per request. + * + * @return {number} Maximum number of listable records per request. + */ + public get maxListRecs() { + return this._maxListRecs; + } + public set maxListRecs(value) { + this._maxListRecs = value; + } + + constructor() { + this._maxListIds = config.max.listidentifiers as number; + this._maxListRecs = config.max.listrecords as number; + // $this->maxListIds = config('oai.max.listidentifiers'); + // $this->maxListRecs = config('oai.max.listrecords'); + // $this->pathTokens = config('app.workspacePath') + // . DIRECTORY_SEPARATOR .'tmp' + // . DIRECTORY_SEPARATOR . 'resumption'; + } + + /** + * Return temporary path for resumption tokens. + * + * @returns {string} token path. + */ + get getResumptionTokenPath(): string { + return this._pathTokens; + } + + /** + * Return maximum number of listable records per request. + * + * @return {number} Maximum number of listable records per request. + */ + // get getMaxListRecords(): number { + // return this._maxListRecs; + // } +} diff --git a/src/library/oai/ResumptionToken.ts b/src/library/oai/ResumptionToken.ts new file mode 100644 index 0000000..afb7fe5 --- /dev/null +++ b/src/library/oai/ResumptionToken.ts @@ -0,0 +1,107 @@ +export default class ResumptionToken { + /** + * Holds dcoument ids + * + * @var array + */ + private _documentIds: number[] = []; + + /** + * Holds metadata prefix information + * + * @var {string} + */ + private _metadataPrefix = ""; + + /** + * Holds resumption id (only if token is stored) + * + * @var {string} + */ + private _resumptionId = ""; + + /** + * Holds start postion + * + * @var {number} + */ + private _startPosition = 0; + + /** + * Holds total amount of document ids + * + * @var {number} + */ + private _totalIds = 0; + + //#region properties + + get Key(): string{ + return this.MetadataPrefix + this.StartPosition + this.TotalIds; + } + + /** + * Returns current holded document ids. + * + * @return array + */ + public get DocumentIds(): number[] { + return this._documentIds; + } + public set DocumentIds(idsToStore: number | number[]) { + if (!Array.isArray(idsToStore)) { + idsToStore = new Array(idsToStore); + } + this._documentIds = idsToStore; + } + + /** + * Returns metadata prefix information. + * + * @return string + */ + public get MetadataPrefix(): string { + return this._metadataPrefix; + } + public set MetadataPrefix(value) { + this._metadataPrefix = value; + } + + /** + * Return setted resumption id after successful storing of resumption token. + * + * @return string + */ + public get ResumptionId() { + return this._resumptionId; + } + public set ResumptionId(resumptionId) { + this._resumptionId = resumptionId; + } + + /** + * Returns start position. + * + * @return in + */ + public get StartPosition() { + return this._startPosition; + } + public set StartPosition(startPosition) { + this._startPosition = startPosition; + } + + /** + * Returns total number of document ids for this request + * + * @return int + */ + public get TotalIds() { + return this._totalIds; + } + public set TotalIds(totalIds) { + this._totalIds = totalIds; + } + + //#endregion properties +} diff --git a/src/library/oai/TokenWorker.ts b/src/library/oai/TokenWorker.ts new file mode 100644 index 0000000..5fb248a --- /dev/null +++ b/src/library/oai/TokenWorker.ts @@ -0,0 +1,194 @@ +import ResumptionToken from "./ResumptionToken"; +import { realpathSync } from "fs"; +import { createClient, RedisClientType } from "redis"; +import InternalServerErrorException from "../../exceptions/InternalServerError"; +import { sprintf } from "sprintf-js"; +import dayjs from "dayjs"; +import * as crypto from "crypto"; + +export default class TokenWorker { + private resumptionPath = ""; + // private resumptionId = null; + protected filePrefix = "rs_"; + protected fileExtension = "txt"; + + private cache: RedisClientType; + private ttl: number; + private url: string; + private connected: boolean = false; + + constructor(ttl: number) { + // if (resPath) { + // this.setResumptionPath(resPath); + // } + // [1] define ttl and create redis connection + this.ttl = ttl; + this.url = process.env.REDIS_URL || "redis://127.0.0.1:6379"; + + // this.cache.on("connect", () => { + // console.log(`Redis connection established`); + // }); + + // this.cache.on("error", (error: string) => { + // console.error(`Redis error, service degraded: ${error}`); + // }); + // The Redis client must be created in an async closure + // (async () => { + // this.cache = createClient({ + // url, + // }); + // this.cache.on("error", (err) => console.log("[Redis] Redis Client Error: ", err)); + // await this.cache.connect(); + // console.log("[Redis]: Successfully connected to the Redis server"); + // })(); + } + public async connect() { + const url = process.env.REDIS_URL || "redis://localhost:6379"; + this.cache = createClient({ + url, + }); + this.cache.on("error", (err) => { + this.connected = false; + console.log("[Redis] Redis Client Error: ", err); + }); + this.cache.on("connect", () => { + this.connected = true; + // console.log(`Redis connection established`); + }); + await this.cache.connect(); + } + + public get Connected(): boolean { + return this.connected; + } + + public async has(key: string): Promise { + const result = await this.cache.get(key); + return result !== undefined && result !== null; + } + + public async set(token: ResumptionToken) { + let fc = 0; + const uniqueId = dayjs().unix().toString(); // 1548381600; + let uniqueName: string; + let cacheKeyExists = true; + do { + // format values + // %s - String + // %d - Signed decimal number (negative, zero or positive) + // [0-9] (Specifies the minimum width held of to the variable value) + uniqueName = sprintf("%s%05d", uniqueId, fc++); + // let file = uniqueName; + cacheKeyExists = await this.has(uniqueName); + } while (cacheKeyExists); + // uniqueName = this.checksum(token.Key); + + const serialToken = JSON.stringify(token); + await this.cache.setEx(uniqueName, this.ttl, serialToken); + return uniqueName; + + // token.ResumptionId = uniqueName; + } + + // public connected(): boolean { + // return this.cache.connected; + // } + + public async get(key: string): Promise { + if (!this.cache) { + throw new InternalServerErrorException("Dataset is not available for OAI export!"); + } + + const result = await this.cache.get(key); + if (result) { + const rToken: ResumptionToken = new ResumptionToken(); + const parsed = JSON.parse(result); + Object.assign(rToken, parsed); + return rToken; + } else { + return null; + } + } + + public del(key: string) { + this.cache.del(key); + } + + public flush() { + this.cache.flushAll(); + } + public async close() { + await this.cache.disconnect(); + this.connected = false; + } + + private checksum(str: string, algorithm?: string, encoding?: string): string { + /** + * @type {BinaryToTextEncoding} + */ + const ENCODING_OUT = "hex"; // Initializer type string is not assignable to variable type BinaryToTextEncoding + + return crypto + .createHash(algorithm || 'md5') + .update(str, 'utf8') + .digest(ENCODING_OUT) + } + + /** + * Set resumption path where the resumption token files are stored. + * + * @throws Oai_Model_ResumptionTokenException Thrown if directory operations failed. + * @return void + */ + public setResumptionPath(resPath: string): void { + // expanding all symbolic links and resolving references + const realPath = realpathSync(resPath); + + // if (empty($realPath) or false === is_dir($realPath)) { + // throw new Oai_Model_ResumptionTokenException( + // 'Given resumption path "' . $resPath . '" (real path: "' . $realPath . '") is not a directory.' + // ); + // } + + // if (false === is_writable($realPath)) { + // throw new Oai_Model_ResumptionTokenException( + // 'Given resumption path "' . $resPath . '" (real path: "' . $realPath . '") is not writeable.' + // ); + // } + this.resumptionPath = realPath; + } + + /** + * Store a resumption token + * + * @param Oai_Model_Resumptiontoken $token Token to store. + * @throws Oai_Model_ResumptionTokenException Thrown on file operation error. + * @return void + */ + public storeResumptionToken(token: ResumptionToken): void { + // $fileName = $this->generateResumptionName(); + const uniqueName = "100"; + const serialToken = JSON.stringify(token); + + // Cache::put($uniqueName, $serialToken, now()->addMinutes(60)); + this.cache.setEx(uniqueName, 86400, serialToken); + // $token->setResumptionId($this->resumptionId); + } + + // private async get(key: string) { + // return await this.redisClient.get(key); + // } + + // public async getResumptionToken(resId: string): Promise { + // let token: ResumptionToken | null = null; + + // var data = await this.get(resId); + // if (data) { + // token = JSON.parse(data); + // if (token instanceof ResumptionToken) { + // return token; + // } + // } + // return token; + // } +} diff --git a/src/models/Dataset.ts b/src/models/Dataset.ts new file mode 100644 index 0000000..03892ea --- /dev/null +++ b/src/models/Dataset.ts @@ -0,0 +1,155 @@ +// import { +// Table, +// Column, +// DataType, +// IsEmail, +// HasMany, +// Model, +// CreatedAt, UpdatedAt, +// BelongsToMany, +// BelongsTo +// } from "sequelize-typescript"; +// import { Abstract } from "./Abstract"; + +// @Table({ +// tableName: "documents" +// }) +// export class Dataset extends Model { + +// @Column({ +// // field: 'type', +// type: DataType.STRING(255), +// allowNull: false, +// }) +// type!: string; + +// @CreatedAt +// @Column({ +// field: 'created_at', +// type: DataType.DATE, +// defaultValue: DataType.NOW +// }) +// created_at!: Date; + +// @UpdatedAt +// @Column({ +// field: 'server_date_modified', +// type: DataType.DATE, +// defaultValue: DataType.NOW +// }) +// server_date_modified!: Date; + +// @Column({ +// field: 'server_state', +// type: DataType.STRING(), +// }) +// serverState!: string; + +// @HasMany(() => Abstract, "document_id") +// public readonly abstracts?: Abstract[]; +// } + +import { Op, Model, DataTypes, InferAttributes, InferCreationAttributes, CreationOptional, NonAttribute, Association } from "sequelize"; +import sequelizeConnection from "../config/db.config"; +import DocumentXmlCache from "./DocumentXmlCache"; + +class Dataset extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare contributing_corporation: string | null; // for nullable fields + declare creating_corporation: string; // not nullable fields + declare publisher_name: string | null; + declare embargo_date: Date | null; + declare publish_id: number | null; + + declare type: string | null; + declare language: string | null; // for nullable fields + declare server_state: string | null; + declare server_date_published: Date | null; + + // createdAt can be undefined during creation + declare created_at: CreationOptional; + // updatedAt can be undefined during creation + declare server_date_modified: CreationOptional; + + // You can also pre-declare possible inclusions, these will only be populated if you + // actively include a relation. + declare xmlCache?: NonAttribute; // Note this is optional since it's only populated when explicitly requested in code + + // getters that are not attributes should be tagged using NonAttribute + // to remove them from the model's Attribute Typings. + get fullName(): NonAttribute { + return this.type; + } + + declare static associations: { + xmlCache: Association; + }; + + public static async earliestPublicationDate(): Promise { + const server_state = "published"; + const condition = { + [Op.and]: [ + { + server_state: { [Op.eq]: server_state }, + }, + ], + }; + + const model = await this.findOne({ + attributes: ["server_date_published"], + where: condition, + order: [["server_date_published", "asc"]], + }); + if (model) { + return model; + } else { + return null; + } + } +} + +Dataset.init( + { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + }, + contributing_corporation: { type: DataTypes.STRING(255) }, + creating_corporation: { type: DataTypes.STRING(255), allowNull: false }, + publisher_name: DataTypes.STRING(255), + embargo_date: DataTypes.DATE, + publish_id: DataTypes.INTEGER, + + type: { + type: DataTypes.STRING, + }, + language: DataTypes.STRING, + server_state: { + type: DataTypes.STRING, + }, + server_date_published: DataTypes.DATE, + + // project_id: DataTypes.INTEGER, + // embargo_date: DataTypes.DATE, + // belongs_to_bibliography: DataTypes.BOOLEAN, + // editor_id: DataTypes.INTEGER, + // preferred_reviewer: DataTypes.STRING, + // preferred_reviewer_email: DataTypes.STRING, + // reviewer_id: DataTypes.INTEGER, + // reject_reviewer_note: DataTypes.STRING, + // reject_editor_note: DataTypes.STRING, + // reviewer_note_visible: DataTypes.BOOLEAN, + + created_at: DataTypes.DATE, + server_date_modified: DataTypes.DATE, + }, + { + createdAt: "created_at", + updatedAt: "server_date_modified", + sequelize: sequelizeConnection, + tableName: "documents", + }, +); + +export default Dataset; diff --git a/src/models/DocumentXmlCache.ts b/src/models/DocumentXmlCache.ts new file mode 100644 index 0000000..9651e4d --- /dev/null +++ b/src/models/DocumentXmlCache.ts @@ -0,0 +1,167 @@ +// import { +// Table, +// PrimaryKey, +// Column, +// DataType, +// Model, +// UpdatedAt, +// } from "sequelize-typescript"; + +// @Table({ +// tableName: "document_xml_cache", +// createdAt: false, +// }) +// export default class DocumentXmlCache extends Model { + +// @PrimaryKey +// @Column({ +// type: DataType.INTEGER, +// allowNull: false, +// }) +// declare document_id: number; + +// @Column({ +// type: DataType.INTEGER, +// allowNull: false, +// }) +// declare xml_version: number; + +// @UpdatedAt +// @Column({ +// field: 'server_date_modified', +// type: DataType.DATE, +// defaultValue: DataType.NOW +// }) +// declare server_date_modified: Date; + +// @Column({ +// type: DataType.TEXT(), +// }) +// declare xml_data: string; +// } + +import { Op, Model, DataTypes, InferAttributes, InferCreationAttributes } from "sequelize"; +import sequelizeConnection from "../config/db.config"; +import { builder, create } from "xmlbuilder2"; +import { XMLBuilder } from "xmlbuilder2/lib/interfaces"; +// import { select, SelectedValue } from "xpath"; +import dayjs from "dayjs"; + +class DocumentXmlCache extends Model, InferCreationAttributes> { + declare document_id: number; + declare xml_version: number; + + // updatedAt can be undefined during creation + // declare server_date_modified: CreationOptional; + declare server_date_modified: string; + + declare xml_data: string; + + // // getters that are not attributes should be tagged using NonAttribute + // // to remove them from the model's Attribute Typings. + // get fullName(): NonAttribute { + // return this.type; + // } + + /** + * Check if a dataset in a specific xml version is already cached or not. + * + * @param mixed datasetId + * @param mixed serverDateModified + * @returns {bool} Returns true on cached hit else false. + */ + public static async hasValidEntry(datasetId: number, datasetServerDateModified: Date): Promise { + const condition = { + [Op.and]: [ + { + document_id: { [Op.eq]: datasetId }, + server_date_modified: { [Op.eq]: dayjs(datasetServerDateModified).format("YYYY-MM-DD HH:mm:ss") }, + }, + ], + }; + // $select = DB::table('document_xml_cache'); + // $select->where('document_id', '=', $datasetId) + // ->where('server_date_modified', '=', $serverDateModified); + + const model = await this.findOne({ + where: condition, + order: [["server_date_modified", "asc"]], + }); + if (model) { + return true; + } else { + return false; + } + } + + /** + * Get dom document of 'xml_data' string + * + * @returns {XMLBuilder} + */ + public getDomDocument(): XMLBuilder { + // const dom = xmlbuilder.create({ version: "1.0", encoding: "UTF-8", standalone: true }); + let dom: XMLBuilder = create({ version: "1.0", encoding: "UTF-8", standalone: true }, this.xml_data); + // return dom.first(); + + const rdrDataset = dom.find( + (n) => { + const test = n.node.nodeName == "Rdr_Dataset"; + return test; + }, + false, + true, + )?.node; + + if (rdrDataset == undefined) { + return dom.first(); + } else { + dom = builder({ version: "1.0", encoding: "UTF-8", standalone: true }, rdrDataset); + return dom; + } + // const doc2 = create().doc(); + // rdrDataset && doc2.import(rdrDataset); + // return doc2.first(); + // rdrDataset && (dom = builder({ version: '1.0', encoding: 'UTF-8', standalone : true }, rdrDataset)); + + // let domNode: Node = dom.node; + // // run the xpath query + // const result: Array = select("//Rdr_Dataset", domNode); + // if (result && result.length && result.length > 0) { + // // convert the DOM node to a builder object + + // const recordNode = builder(result.at(0)); + // const doc2 = create().doc(); + // // import into result document + // doc2.import(recordNode); + // // console.log(doc2.end({ prettyPrint: true })); + // return doc2; + // } + // return dom.first(); + } +} + +DocumentXmlCache.init( + { + document_id: { + type: DataTypes.INTEGER, + primaryKey: true, + }, + xml_version: { + type: DataTypes.INTEGER, + allowNull: false, + }, + server_date_modified: DataTypes.STRING(50), + xml_data: { + type: DataTypes.TEXT, + }, + }, + { + createdAt: false, + updatedAt: false, //"server_date_modified", + sequelize: sequelizeConnection, + tableName: "document_xml_cache", + }, +); + +export default DocumentXmlCache; diff --git a/src/models/Identifier.ts b/src/models/Identifier.ts new file mode 100644 index 0000000..f3f5c5e --- /dev/null +++ b/src/models/Identifier.ts @@ -0,0 +1,43 @@ +import { Model, DataTypes, InferAttributes, InferCreationAttributes, CreationOptional } from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +class Identifier extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare value: string; // not nullable fields + declare type: string; + declare status: string | null; + + // createdAt can be undefined during creation + declare created_at: CreationOptional; + // updatedAt can be undefined during creation + declare updated_at: CreationOptional; +} + +Identifier.init( + { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + }, + value: { + type: DataTypes.STRING(255), + allowNull: false, + }, + type: { + type: DataTypes.STRING(255), + allowNull: false, + }, + status: DataTypes.STRING(255), + created_at: DataTypes.DATE, + updated_at: DataTypes.DATE, + }, + { + createdAt: "created_at", + updatedAt: "updated_at", + tableName: "dataset_identifiers", + sequelize: sequelizeConnection, + }, +); + +export default Identifier; diff --git a/src/models/Person.ts b/src/models/Person.ts new file mode 100644 index 0000000..61c6c18 --- /dev/null +++ b/src/models/Person.ts @@ -0,0 +1,64 @@ +import { Model, DataTypes, InferAttributes, InferCreationAttributes, CreationOptional } from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +class Person extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare academic_title: string | null; // for nullable fields + declare email: string; // not nullable fields + declare first_name: string | null; // for nullable fields + declare last_name: string; + declare place_of_birth: string | null; + declare identifier_orcid: string | null; + declare identifier_gnd: string | null; + declare identifier_misc: string | null; + declare status: boolean | null; + declare name_type: string | null; // for nullable fields + + // getters that are not attributes should be tagged using NonAttribute + // to remove them from the model's Attribute Typings. + get full_name(): string { + return this.first_name + " " + this.last_name; + } +} + +Person.init( + { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + }, + academic_title: DataTypes.STRING(255), + email: { + type: DataTypes.STRING(100), + allowNull: false, + }, + first_name: DataTypes.STRING(255), + last_name: { + type: DataTypes.STRING(255), + allowNull: false, + }, + place_of_birth: DataTypes.STRING(255), + identifier_orcid: DataTypes.STRING(50), + identifier_gnd: DataTypes.STRING(50), + identifier_misc: DataTypes.STRING(50), + status: { + type: DataTypes.BOOLEAN, + defaultValue: true, + }, + name_type: DataTypes.STRING(255), + full_name: { + type: new DataTypes.VIRTUAL(DataTypes.STRING(255), ["first_name", "last_name"]), + get(): string { + return this.first_name + " " + this.last_name; + }, + }, + }, + { + timestamps: false, + tableName: "persons", + sequelize: sequelizeConnection, + }, +); + +export default Person; diff --git a/src/models/Project.ts b/src/models/Project.ts new file mode 100644 index 0000000..89156ea --- /dev/null +++ b/src/models/Project.ts @@ -0,0 +1,41 @@ +// import Sequelize from "sequelize"; +import { Model, DataTypes, InferAttributes, InferCreationAttributes, CreationOptional } from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +class Project extends Model, InferCreationAttributes> { + // id can be undefined during creation when using `autoIncrement` + declare id: CreationOptional; + declare label: string; // not nullable fields + declare name: string; + + // createdAt can be undefined during creation + declare created_at: CreationOptional; + // updatedAt can be undefined during creation + declare updated_at: CreationOptional; +} + +Project.init( + { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + }, + label: { + type: DataTypes.STRING(50), + allowNull: false, + }, + name: { + type: DataTypes.STRING(255), + allowNull: false, + }, + created_at: DataTypes.DATE, + updated_at: DataTypes.DATE, + }, + { + createdAt: "created_at", + updatedAt: "updated_at", + sequelize: sequelizeConnection, + tableName: "projects", + }, +); +export default Project; diff --git a/src/models/abstract.model.js b/src/models/abstract.model.js new file mode 100644 index 0000000..7a18aea --- /dev/null +++ b/src/models/abstract.model.js @@ -0,0 +1,32 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +const Abstract = sequelizeConnection.define( + "dataset_abstracts", + { + type: { + type: Sequelize.STRING, + allowNull: false, + length: 255, + }, + value: { + type: Sequelize.TEXT, + allowNull: false, + }, + language: { + type: Sequelize.STRING, + allowNull: false, + length: 3, + }, + }, + { + timestamps: false, + tableName: "dataset_abstracts", + }, +); +// Abstract.belongsTo(Dataset, { +// foreignKey: "document_id", +// as: "dataset", +// }); + +export default Abstract; diff --git a/src/models/coverage.model.js b/src/models/coverage.model.js new file mode 100644 index 0000000..5f18210 --- /dev/null +++ b/src/models/coverage.model.js @@ -0,0 +1,34 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +// module.exports = (sequelize, DataTypes) => { + +const Coverage = sequelizeConnection.define( + "coverage", + { + elevation_min: Sequelize.INTEGER, + elevation_max: Sequelize.INTEGER, + elevation_absolut: Sequelize.INTEGER, + depth_min: Sequelize.INTEGER, + depth_max: Sequelize.INTEGER, + depth_absolut: Sequelize.INTEGER, + time_min: Sequelize.INTEGER, + time_max: Sequelize.INTEGER, + time_absolut: Sequelize.INTEGER, + x_min: Sequelize.DOUBLE, + x_max: Sequelize.DOUBLE, + y_min: Sequelize.DOUBLE, + y_max: Sequelize.DOUBLE, + created_at: Sequelize.DATE, + updated_at: Sequelize.DATE, + }, + { + createdAt: "created_at", + updatedAt: "updated_at", + // schema: 'public', + tableName: "coverage", + }, +); + +export default Coverage; +// }; diff --git a/src/models/dataset.model.js b/src/models/dataset.model.js new file mode 100644 index 0000000..926a425 --- /dev/null +++ b/src/models/dataset.model.js @@ -0,0 +1,49 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +const Dataset = sequelizeConnection.define( + "documents", + { + type: { + type: Sequelize.STRING, + }, + language: Sequelize.STRING, + server_state: { + type: Sequelize.STRING, + }, + server_date_published: Sequelize.DATE, + publisher_name: Sequelize.STRING, + publish_id: Sequelize.INTEGER, + creating_corporation: Sequelize.STRING, + project_id: Sequelize.INTEGER, + embargo_date: Sequelize.DATE, + belongs_to_bibliography: Sequelize.BOOLEAN, + editor_id: Sequelize.INTEGER, + preferred_reviewer: Sequelize.STRING, + preferred_reviewer_email: Sequelize.STRING, + reviewer_id: Sequelize.INTEGER, + reject_reviewer_note: Sequelize.STRING, + reject_editor_note: Sequelize.STRING, + reviewer_note_visible: Sequelize.BOOLEAN, + + created_at: Sequelize.DATE, + server_date_modified: Sequelize.DATE, + }, + { + createdAt: "created_at", + updatedAt: "server_date_modified", + // schema: 'public', + tableName: "documents", + }, +); +// // relations +// Dataset.hasMany(Title, { +// as: "titles", +// foreignKey: "document_id" +// }); +// Title.belongsTo(Dataset, { +// foreignKey: "document_id", +// as: "dataset", +// }); + +export default Dataset; diff --git a/src/models/file.model.js b/src/models/file.model.js new file mode 100644 index 0000000..9443a2a --- /dev/null +++ b/src/models/file.model.js @@ -0,0 +1,44 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +const File = sequelizeConnection.define( + "document_files", + { + path_name: { + type: Sequelize.STRING, + allowNull: false, + length: 100, + }, + label: Sequelize.STRING(100), + comment: Sequelize.STRING(255), + mime_type: Sequelize.STRING(255), + language: Sequelize.STRING(3), + file_size: { + type: Sequelize.BIGINT, + allowNull: false, + }, + visible_in_frontdoor: { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: true, + }, + visible_in_oai: { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: true, + }, + sort_order: { + type: Sequelize.INTEGER, + allowNull: false, + }, + created_at: Sequelize.DATE, + updated_at: Sequelize.DATE, + }, + { + createdAt: "created_at", + updatedAt: "updated_at", + tableName: "document_files", + }, +); + +export default File; diff --git a/src/models/init-models.js b/src/models/init-models.js new file mode 100644 index 0000000..db2f9a9 --- /dev/null +++ b/src/models/init-models.js @@ -0,0 +1,210 @@ +// import Sequelize from 'sequelize' +import sequelizeConnection from "../config/db.config"; +import Dataset from "./Dataset"; +import Title from "./title.model.js"; +import Abstract from "./abstract.model.js"; +import Coverage from "./coverage.model.js"; +import License from "./license.model.js"; +import User from "./user.model.js"; +// import Person from "./person.model.js"; +import Person from "./Person"; +import { Sequelize } from "sequelize"; +import Subject from "./subject.model.js"; +import Project from "./Project"; +import File from "./file.model.js"; +import Identifier from "./Identifier"; +import DocumentXmlCache from "./DocumentXmlCache"; + +const dbContext = initModels(); + +export { Dataset, Title, Abstract, User, Person, Subject, Coverage, License, Project, Identifier, DocumentXmlCache }; +export default dbContext; + +export function initModels() { + // title identifier + Dataset.hasOne(Identifier, { + as: "identifier", + foreignKey: "dataset_id", + }); + Identifier.belongsTo(Dataset, { + foreignKey: "dataset_id", + as: "dataset", + }); + + // title relations + Dataset.hasMany(Title, { + as: "titles", + foreignKey: "document_id", + }); + Title.belongsTo(Dataset, { + foreignKey: "document_id", + as: "dataset", + }); + + // abstract relations + Dataset.hasMany(Abstract, { + as: "abstracts", + foreignKey: "document_id", + }); + Abstract.belongsTo(Dataset, { + foreignKey: "document_id", + as: "dataset", + }); + + //user relations + User.hasMany(Dataset, { + foreignKey: "account_id", + as: "datasets", + }); + Dataset.belongsTo(User, { + foreignKey: "account_id", + as: "user", + }); + + // authors and contributors + const DocumentPersons = sequelizeConnection.define( + "link_documents_persons", + { + person_id: { type: Sequelize.INTEGER, primaryKey: true }, + document_id: { type: Sequelize.INTEGER, primaryKey: true }, + // role: { type: Sequelize.STRING(255), defaultValue: "other", primaryKey: true}, + role: { + type: Sequelize.ENUM("author", "contributor", "other"), + // scopes: { + // author: ["author"], + // contributor: ["contributor"], + // }, + }, + sort_order: Sequelize.INTEGER, + allow_email_contact: Sequelize.BOOLEAN, + contributor_type: Sequelize.STRING(255), + }, + { + // schema: 'public', + tableName: "link_documents_persons", + timestamps: false, + }, + ); + + // relation authors + Dataset.belongsToMany(Person, { + through: { + model: DocumentPersons, + // scope: { role: "author" }, + }, + as: "authors", + foreignKey: "document_id", + }); + Person.belongsToMany(Dataset, { + through: { + model: DocumentPersons, + }, + foreignKey: "person_id", + as: "a_datasets", + }); + + // relation contributors + Dataset.belongsToMany(Person, { + through: { + model: DocumentPersons, + }, + as: "contributors", + foreignKey: "document_id", + }); + Person.belongsToMany(Dataset, { + through: { + model: DocumentPersons, + }, + foreignKey: "person_id", + as: "c_datasets", + }); + + //subjects + const DatasetSubject = sequelizeConnection.define( + "link_dataset_subjects", + {}, + { + tableName: "link_dataset_subjects", + timestamps: false, + }, + ); + Dataset.belongsToMany(Subject, { + through: DatasetSubject, + as: "subjects", + foreignKey: "document_id", + }); + Subject.belongsToMany(Dataset, { + through: DatasetSubject, + foreignKey: "subject_id", + as: "datasets", + }); + + // coverage + Dataset.hasOne(Coverage, { + as: "coverage", + foreignKey: "dataset_id", + }); + Coverage.belongsTo(Dataset, { + foreignKey: "dataset_id", + as: "dataset", + }); + + // xmlCache + Dataset.hasOne(DocumentXmlCache, { + as: "xmlCache", + foreignKey: "document_id", + }); + // Coverage.belongsTo(Dataset, { + // foreignKey: "dataset_id", + // as: "dataset", + // }); + + //licences + const DatasetLicense = sequelizeConnection.define( + "link_documents_licences", + {}, + { + tableName: "link_documents_licences", + timestamps: false, + }, + ); + Dataset.belongsToMany(License, { + through: DatasetLicense, + as: "licenses", + foreignKey: "document_id", + }); + License.belongsToMany(Dataset, { + through: DatasetLicense, + foreignKey: "licence_id", + as: "datasets", + }); + + //project relations + Project.hasMany(Dataset, { + foreignKey: "project_id", + as: "datasets", + }); + Dataset.belongsTo(Project, { + foreignKey: "project_id", + as: "project", + }); + + //file relations + // title relations + Dataset.hasMany(File, { + as: "files", + foreignKey: "document_id", + }); + File.belongsTo(Dataset, { + foreignKey: "document_id", + as: "dataset", + }); + + return { + Dataset: Dataset, + Title: Title, + Coverage: Coverage, + Subject: Subject, + License: License, + }; +} diff --git a/src/models/license.model.js b/src/models/license.model.js new file mode 100644 index 0000000..cfb93f0 --- /dev/null +++ b/src/models/license.model.js @@ -0,0 +1,51 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +// module.exports = (sequelize, DataTypes) => { + +const License = sequelizeConnection.define( + "coverage", + { + active: { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: true, + }, + comment_internal: Sequelize.STRING, + desc_markup: Sequelize.STRING, + desc_text: Sequelize.STRING, + language: Sequelize.STRING, + link_licence: { + type: Sequelize.STRING, + allowNull: false, + }, + link_logo: Sequelize.STRING, + link_sign: Sequelize.STRING, + mime_type: Sequelize.STRING, + name_long: { + type: Sequelize.STRING, + allowNull: false, + }, + name: { + type: Sequelize.STRING, + allowNull: false, + }, + pod_allowed: { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + sort_order: { + type: Sequelize.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + }, + { + timestamps: false, + tableName: "document_licences", + }, +); + +export default License; +// }; diff --git a/src/models/person.model.js b/src/models/person.model.js new file mode 100644 index 0000000..1ef9201 --- /dev/null +++ b/src/models/person.model.js @@ -0,0 +1,20 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +const Person = sequelizeConnection.define( + "persons", + { + email: { + type: Sequelize.STRING, + allowNull: false, + length: 255, + }, + first_name: Sequelize.STRING(255), + last_name: Sequelize.STRING(255), + }, + { + timestamps: false, + tableName: "persons", + }, +); +export default Person; diff --git a/src/models/subject.model.js b/src/models/subject.model.js new file mode 100644 index 0000000..f76e55a --- /dev/null +++ b/src/models/subject.model.js @@ -0,0 +1,33 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +const Subject = sequelizeConnection.define( + "dataset_subjects", + { + type: { + type: Sequelize.STRING, + allowNull: false, + length: 255, + }, + value: { + type: Sequelize.STRING, + allowNull: false, + length: 255, + }, + external_key: { + type: Sequelize.STRING, + allowNull: true, + length: 255, + }, + language: Sequelize.STRING(3), + created_at: Sequelize.DATE, + updated_at: Sequelize.DATE, + }, + { + createdAt: "created_at", + updatedAt: "updated_at", + tableName: "dataset_subjects", + }, +); + +export default Subject; diff --git a/src/models/title.model.js b/src/models/title.model.js new file mode 100644 index 0000000..8a06a56 --- /dev/null +++ b/src/models/title.model.js @@ -0,0 +1,26 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +// module.exports = (sequelize, Sequelize) => { +const Title = sequelizeConnection.define( + "dataset_titles", + { + type: Sequelize.STRING, + value: Sequelize.STRING, + language: Sequelize.STRING, + }, + { + // schema: 'public', + timestamps: false, + tableName: "dataset_titles", + }, +); +// Title.belongsTo(Dataset, { +// foreignKey: "document_id", +// as: "dataset", +// }); + +export default Title; + +// return Title; +// }; diff --git a/src/models/user.model.js b/src/models/user.model.js new file mode 100644 index 0000000..33368cf --- /dev/null +++ b/src/models/user.model.js @@ -0,0 +1,39 @@ +import Sequelize from "sequelize"; +import sequelizeConnection from "../config/db.config"; + +const User = sequelizeConnection.define( + "accounts", + { + login: { + type: Sequelize.STRING, + allowNull: false, + length: 20, + }, + password: { + type: Sequelize.STRING, + allowNull: false, + length: 60, + }, + email: { + type: Sequelize.STRING, + allowNull: false, + length: 255, + }, + first_name: Sequelize.STRING(255), + last_name: Sequelize.STRING(255), + remember_token: Sequelize.STRING(255), + created_at: Sequelize.DATE, + updated_at: Sequelize.DATE, + }, + { + defaultScope: { + attributes: { + exclude: ["password", "remember_token"], + }, + }, + createdAt: "created_at", + updatedAt: "updated_at", + tableName: "accounts", + }, +); +export default User; diff --git a/src/routes/dataset.routes.js b/src/routes/dataset.routes.js new file mode 100644 index 0000000..299c291 --- /dev/null +++ b/src/routes/dataset.routes.js @@ -0,0 +1,38 @@ +// module.exports = app => { +// const datasetController = require("../controllers/dataset.controller.js"); + +// var router = require("express").Router(); + +// // // Create a new Dataset +// // router.post("/", datasetController.create); + +// // Retrieve all Tutorials +// router.get("/", datasetController.findAll); + +// // // Retrieve all published Dataset +// // router.get("/published", tutorials.findAllPublished); + +// // Retrieve a single Dataset with publish_id +// router.get("/:publish_id", datasetController.findOne); + +// app.use('/api/dataset', router); +// }; + +import { Router } from "express"; +// import "@babel/polyfill" +import { findAll, findOne } from "../controllers/dataset.controller"; + +const router = new Router(); + +// Retrieve all Tutorials +router.get("/", findAll); +// router.get("/years/", findYears); +// Retrieve a single Dataset with publish_id +router.get("/:publish_id", findOne); +// router.post('/getUsers', getUsers); +// router.post('/getUser', getUser); +// router.post('/create', createUser); +// router.delete('/removeUser', deleteUser); +// router.put('/updateUser', updateUsers); + +export default router; diff --git a/src/routes/home.routes.js b/src/routes/home.routes.js new file mode 100644 index 0000000..db90d24 --- /dev/null +++ b/src/routes/home.routes.js @@ -0,0 +1,12 @@ +import { Router } from "express"; +// import "@babel/polyfill" +import { findYears, findDocumentsPerYear } from "../controllers/home.controller.js"; + +const router = Router(); + +// Retrieve all Tutorials +// router.get("/", findAll); +router.get("/years", findYears); +router.get("/sitelinks/:year", findDocumentsPerYear); + +export default router; diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..408626d --- /dev/null +++ b/src/server.ts @@ -0,0 +1,158 @@ +// const express = require('express'); +// // const bodyParser = require('body-parser'); +// // const cors = require('cors'); +// // https://www.bezkoder.com/node-express-sequelize-postgresql/ +// // Next, we'll want to instantiate the Express app: +// const app = express(); +// app.use(express.static(__dirname + '/client')); + +// https://github.com/ivan-shaban/nodemon-babel-preset-typescript/blob/master/README.md +// https://github.com/microsoft/TypeScript-Babel-Starter +import "core-js/stable"; +import "regenerator-runtime/runtime"; + +import { App } from "./app"; +const app: App = new App(); +app.start(); +// import express, { Express, Request, Response } from 'express'; +// import bodyParser from 'body-parser'; + +// //Importing Routes +// import DatasetRoutes from './routes/dataset.routes.js'; +// import HomeRoutes from './routes/home.routes.js'; + +// const app: Express = express(); +//middlewares +// app.all('*', function(req, res, next) { +// res.setHeader("Access-Control-Allow-Origin", "*"); +// res.header("Access-Control-Allow-Methods", "POST, PUT, OPTIONS, DELETE, GET"); +// res.header("Access-Control-Max-Age", "3600"); +// res.header("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With, x-access-token"); +// next(); +// }); + +// app.use(bodyParser.json({limit: '100mb'})); +// app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); +// app.use(bodyParser.json({type: 'application/vnd.api+json'})); + +// //routes +// app.use('/api/dataset', DatasetRoutes); +// app.use('/api/', HomeRoutes); + +// Where we will keep books +// const books = [ +// { +// isbn: "9781593275846", +// title: "Eloquent JavaScript, Second Edition", +// author: "Marijn Haverbeke", +// publish_date: "2014-12-14", +// publisher: "No Starch Press", +// numOfPages: 472, +// }, +// { +// isbn: "9781449331818", +// title: "Learning JavaScript Design Patterns", +// author: "Addy Osmani", +// publish_date: "2012-07-01", +// publisher: "O'Reilly Media", +// numOfPages: 254, +// }, +// { +// isbn: "9781449365035", +// title: "Speaking JavaScript", +// author: "Axel Rauschmayer", +// publish_date: "2014-02-01", +// publisher: "O'Reilly Media", +// numOfPages: 460, +// }, +// ]; + +// load middlewar: +// app.use(cors()); +// Configuring body parser middleware +// app.use(bodyParser.urlencoded({ extended: false })); +// app.use(bodyParser.json()); +// app.use(express.json()); + +// const db = require("./models"); +// db.sequelize.sync() +// .then(() => { +// console.log("Synced db."); +// }) +// .catch((err) => { +// console.log("Failed to sync db: " + err.message); +// }); + +// app.post('/book', (req, res) => { +// const book = req.body; + +// // Output the book to the console for debugging +// console.log(book); +// books.push(book); + +// res.send('Book is added to the database'); +// }); + +// app.get('/books', async (req, res) => { +// res.json(books); +// // const allDogs = await Dataset.findAll(); +// // return res.status(200).json(allDogs); +// }); + +// app.get('/book/:isbn', (req, res) => { +// // reading isbn from the URL +// const isbn = req.params.isbn; + +// // searching books for the isbn +// for (let book of books) { +// if (book.isbn === isbn) { +// res.json(book); +// return; +// } +// } + +// // sending 404 when not found something is a good practice +// res.status(404).send('Book not found'); +// }); + +// app.post('/book/:isbn', (req, res) => { +// // reading isbn from the URL +// const isbn = req.params.isbn; +// const newBook = req.body; + +// // remove item from the books array +// for (let i = 0; i < books.length; i++) { +// let book = books[i] + +// if (book.isbn === isbn) { +// books[i] = newBook; +// } +// } + +// // sending 404 when not found something is a good practice +// res.send('Book is edited'); +// }); + +// // ow, we can create a simple GET endpoint right beneath the boilerplate. +// // We'd like to set it to be on the home page, so the URL for the endpoint is /: +// app.get('/', (request, response) => { +// // response.send('Hello World, from express'); +// response.sendFile('/home/administrator/api/new-book.html'); +// }); + +// app.get('/booklist', (request, response) => { +// // response.send('Hello World, from express'); +// response.sendFile('/home/administrator/api/client/book-list.html'); +// }); + +// // require("./routes/dataset.routes")(app); + +// // set port, listen for requests +// const port = process.env.PORT || 3000; +// app.set('port', port); +// // At this point, let's start our clients: +// app.listen(app.get('port'), function () { +// console.log('Express server listening on port ' + port); +// }); + +// export default app; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1038b85 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,38 @@ +{ + // This ensures typescript only does type checking and doesn't output js. + // "noEmit": true, + "compilerOptions": { + "module": "commonjs", + "allowSyntheticDefaultImports": true, + "noImplicitAny": true, + "sourceMap": true, + // "importHelpers": true, + "outDir": "dist", + "baseUrl": ".", + // Target latest version 'esnext' of ECMAScript or minimal 'es6'. + "target": "esnext", + // Search under node_modules for non-relative imports. + "moduleResolution": "node", + // Process & infer types from .js files. + "allowJs": true, + // // Don't emit; allow Babel to transform files. + // "noEmit": true, + // Enable strictest settings like strictNullChecks & noImplicitAny. + "strict": true, + // Disallow features that require cross-file information for emit. + "isolatedModules": true, + // Import non-ES modules as default imports. + "esModuleInterop": true, + // for sequelize-typescript: Enables experimental support for ES7 decorators. , + "experimentalDecorators": true, + "strictPropertyInitialization": false, + + "paths": { + "*": [ + "node_modules/*" + ] + }, + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "**/*.spec.ts", "dist", "test"] +} \ No newline at end of file