diff --git a/projects/oscal-import/src/www_fm22-6_simple.xsl b/projects/oscal-import/src/www_fm22-6_fulltext.xsl similarity index 98% rename from projects/oscal-import/src/www_fm22-6_simple.xsl rename to projects/oscal-import/src/www_fm22-6_fulltext.xsl index d1752d96..c13252ce 100644 --- a/projects/oscal-import/src/www_fm22-6_simple.xsl +++ b/projects/oscal-import/src/www_fm22-6_fulltext.xsl @@ -11,9 +11,12 @@ - + + <xsl:value-of select="*/oscal:metadata/oscal:title"/> + + + - @@ -489,4 +492,7 @@ th { background-color: gainsboro } + + + diff --git a/projects/oscal-import/src/www_fm22-6_summary.xsl b/projects/oscal-import/src/www_fm22-6_summary.xsl deleted file mode 100644 index 509d2418..00000000 --- a/projects/oscal-import/src/www_fm22-6_summary.xsl +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - -
- -
-
- -
- -
-
\ No newline at end of file diff --git a/projects/oscal-import/src/www_fm22-6_tables.xsl b/projects/oscal-import/src/www_fm22-6_tables.xsl new file mode 100644 index 00000000..b21b6c3c --- /dev/null +++ b/projects/oscal-import/src/www_fm22-6_tables.xsl @@ -0,0 +1,45 @@ + + + + + + + +
+ +
+
+ +
+ +
+ + + + + + + + + + + +
\ No newline at end of file diff --git a/projects/xproc-doc/XPROC-STEP-INDEX-HTML.xpl b/projects/xproc-doc/XPROC-STEP-INDEX-HTML.xpl index ee49cf40..6717d374 100644 --- a/projects/xproc-doc/XPROC-STEP-INDEX-HTML.xpl +++ b/projects/xproc-doc/XPROC-STEP-INDEX-HTML.xpl @@ -40,9 +40,7 @@ - - - + diff --git a/projects/xproc-doc/src/declarations-html.xsl b/projects/xproc-doc/src/declarations-html.xsl index 6d0117bc..9ca676e1 100644 --- a/projects/xproc-doc/src/declarations-html.xsl +++ b/projects/xproc-doc/src/declarations-html.xsl @@ -159,6 +159,7 @@ +
@@ -166,8 +167,15 @@ + - + + + + + + + { @type } diff --git a/tutorial/PRODUCE-TUTORIAL-MARKDOWN.xpl b/tutorial/PRODUCE-TUTORIAL-MARKDOWN.xpl index 1612d992..fc4c4da8 100644 --- a/tutorial/PRODUCE-TUTORIAL-MARKDOWN.xpl +++ b/tutorial/PRODUCE-TUTORIAL-MARKDOWN.xpl @@ -93,9 +93,11 @@ - + - + + + diff --git a/tutorial/sequence/Lesson01/setup_101.md b/tutorial/sequence/Lesson01/setup_101.md index 17d848a8..c7ac470f 100644 --- a/tutorial/sequence/Lesson01/setup_101.md +++ b/tutorial/sequence/Lesson01/setup_101.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/setup/setup_101_src.html](../../../tutorial/source/setup/setup_101_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -23,13 +24,13 @@ You have a live Internet connection and the capability to download and save reso You are comfortable entering commands on the command line. For installation, you want a `bash` shell if available. On Windows, both WSL (Ubuntu) and Git Bash have been found to work. If you cannot use `bash`, the setup can be done by hand (downloading and unpacking a package from SourceForge). -After installation, subsequent work on Windows does not require `bash` unless you choose to use it – a Windows `CMD` or Powershell can serve as your environment and the processor invoked with a Windows `bat` file (as described in the documentation). Mac and Linux (and WSL) users can continue to use `bash`. +After installation, subsequent work on Windows does not require `bash` unless you choose to use it – a Windows `CMD` or Powershell can serve as your environment and the processor invoked with a Windows `bat` file (as described in the documentation). Mac and Linux (and WSL) users can continue to use `bash`. ## Resources The setup script is a `bash` script: [./setup.sh](../../../setup.sh), to be run with no arguments. -For XProc runtime -- to execute pipelines -- use either of the scripts [./xp3.sh](../../../xp3.sh) (under `bash`) or [./xp3.bat](../../../xp3.bat) (for Windows). These scripts are used for all pipelines (basically, for everything) unless otherwise noted. +For XProc runtime — to execute pipelines — use either of the scripts [./xp3.sh](../../../xp3.sh) (under `bash`) or [./xp3.bat](../../../xp3.bat) (for Windows). These scripts are used for all pipelines (basically, for everything) unless otherwise noted. The following pipelines will be run. They are described in top-level [README](../../../README.md) documentation and the expected places. @@ -81,13 +82,15 @@ When you can run all the smoke tests without ugly tracebacks, this lesson is com Within this project as a whole, and within its subprojects, everything is done with XProc 3.0, meaning everything can be done using a single script, which invokes an XProc processor to read and execute a pipeline. This simplicity is at the center of the argument for XProc. The counter argument is that the world is never like that. This project is based on the premise that a lab environment can be useful even for studying things more commonly encountered in the real world. -Effectively (and much more could be said about the processing stack, dependency management and so forth) what this means is that XProc offers the user and the developer (in either or both roles) very focused and concentrated points of control or points of adjustment. Out in the field - where software is deployed and used - it may never be like that. User interfaces constrain what users can do, and even developers are rarely free to just mess around, as it might be thought of. +Effectively (and much more could be said about the processing stack, dependency management and so forth) what this means is that XProc offers the user and the developer (in either or both roles) with focused and concentrated points of control or points of adjustment. In the field -- where software is deployed and used -- things almost never just “drop in”. User interfaces, APIs, dependencies and platform quirks: all these constrain what users can do, and even developers are rarely free to just mess around, as it might be thought of. -To the extent this is the case, this project only works if things are actually simple enough to pick up and use. +To the extent this is the case, this project only works if things are actually simple enough to pick up, use, learn and adapt. `xp3.sh` and `xp3.bat` represent attempts at this. Each of them (on its execution platform) enables a user to run, without further configuration, the [Morgana XProcIIIse](https://www.xml-project.com/morganaxproc-iiise.html) processor on any XProc 3.0 pipeline, assuming the appropriate platform for each (`bash` in the case of the shell script, Windows batch command syntax for the `bat` file). Other platforms supporting Java (and hence Morgana with its libraries) could be provided with similar scripts. -Such a script itself must be “vanilla” and generic: it simply invokes the processor with the designated pipeline, and stands back. The logic of operations is entirely encapsulated in the XProc pipeline designated. XProc 3.0 is both scalable and flexible enough to open a wide range of possibilities for data processing, both XML-based and using other formats such as JSON and plain text. It is the intent of this project not to explore and map this space – which is vast – but to show off enough XProc and related logic (XSLT, XSpec) to show how this exploration can be done. +Such a script itself must be “vanilla” and generic: it simply invokes the processor with the designated pipeline, and stands back. The logic of operations is entirely encapsulated in the XProc pipeline designated. XProc 3.0 is both scalable and flexible enough to open a wide range of possibilities for data processing, both XML-based and using other formats such as JSON and plain text. It is the intent of this project not to explore and map this space – which is vast – but to show off enough XProc and related logic (XSLT, XSpec) to show how this exploration can be done. We are an outfitter at the beginning of what we hope will be a long and profitable voyage. + +### Tweaks As simple examples, these scripts show only one way of running XProc. Keep in mind that even simple scripts can be used in more than one way. @@ -115,4 +118,4 @@ Windows users (and others to varying degrees) can set up a drag-and-drop based w It is important to try things out since any of these methods can be the basis of a workflow. -For the big picture, keep in mind that while the command line is useful for development and demonstration – and however familiar XProc itself may become to the developer – to the uninitiated it remains obscure and cryptic. XProc-based systems, when integrated into tools or developer editors and environments, can look much nicer than tracebacks in a console window. The beauty we are looking for here is in a different kind of elegance and power. \ No newline at end of file +For the big picture, keep in mind that while the command line is useful for development and demonstration – and however familiar XProc itself may become to the developer – to the uninitiated it remains obscure and cryptic. XProc-based systems, when integrated into tools or developer editors and environments, can look much nicer than tracebacks in a console window. The beauty we are looking for here is in a different kind of elegance and power. diff --git a/tutorial/sequence/Lesson01/setup_102.md b/tutorial/sequence/Lesson01/setup_102.md index 0161c72e..a3a066c0 100644 --- a/tutorial/sequence/Lesson01/setup_102.md +++ b/tutorial/sequence/Lesson01/setup_102.md @@ -1,12 +1,11 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/setup/setup_102_src.html](../../../tutorial/source/setup/setup_102_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). # 102: Examining the setup - - ## Goals * Look at some pipeline organization and syntax on the inside @@ -14,13 +13,13 @@ ## Resources -Same as [Setup 101](setup_101_src.html). +Same as [Setup 101](setup_101.md). ## Prerequisites -Please complete the repository setup and smoke tests as described in the [101 lesson](setup_101_src.html). In this lesson, we will run these pipelines with adjustments, or similar pipelines. +Please complete the repository setup and smoke tests as described in the [101 lesson](setup_101.md). In this lesson, we will run these pipelines with adjustments, or similar pipelines. -This discussion assumes basic knowledge of coding, the Internet (including retrieving resources via `file` and `http` protocols, and web-based technologies including HTML. +This discussion assumes basic knowledge of coding, the Internet (including retrieving resources via `file` and `http` protocols), and web-based technologies including HTML. XML knowledge is also assumed. In particular, XProc uses [XPath 3.1](https://www.w3.org/TR/xpath-31/), the query language for XML. This latest version of XPath builds on XPath 1.0, so any XPath experience will help. In general, any XSLT or XQuery experience will be invaluable. @@ -30,7 +29,7 @@ You will also need a programmer's plain text editor, XML/XSLT editor or IDE (int The two groupings of pipelines used in setup and testing can be considered separately. -The key to understanding both groups is to know that once the initial [Setup script](../../../setup.sh) is run, Morgana can be invoked directly, as paths and scripts are already in place. In doing so – before extension libraries are in place – it can use only basic XProc steps, but those are enough for these purposes. +The key to understanding both groups is to know that once the initial [Setup script](../../../setup.sh) is run, Morgana can be invoked directly, as paths and scripts are already in place. In doing so – before extension libraries are in place – it can use only basic XProc steps, but those are enough for these purposes. Specifically, the pipelines can acquire resources from the Internet, save them locally, and perform unarchiving (unzipping). Having been downloaded, each library provides software that the pipeline engine (Morgana) can use to do more. @@ -73,6 +72,6 @@ Developers coming to this technology need to consider who would use it, and whet Key to this question is not only whether attractive and capable user interfaces (or other mediators) can be developed (this is a known problem) but more importantly whether the systems themselves are adaptable enough so they can be deployed, used, refitted and maintained not just for repetitive generic tasks, but for *particular*, *special* and *local* problems discovered only at the points where information is gathered and codified. -This larger fitting of solutions to problems is a responsibility for both CMEs (content matter experts) and developers together, who must define problems to be solved before approaches to them can be found. +This larger fitting of solutions to problems is a responsibility for both SMEs (subject matter experts) and developers together, who must define problems to be solved before approaches to them can be found. -The open questions are: who can use XProc pipelines; and how can they be made more useful? The questions come up in an OSCAL context or any context where XML is demonstrably capable. \ No newline at end of file +The open questions are: who can use XProc pipelines; and how can they be made more useful? The questions come up in an OSCAL context or any context where XML is demonstrably capable. diff --git a/tutorial/sequence/Lesson01/setup_599.md b/tutorial/sequence/Lesson01/setup_599.md index 2578c233..4ce69749 100644 --- a/tutorial/sequence/Lesson01/setup_599.md +++ b/tutorial/sequence/Lesson01/setup_599.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/setup/setup_599_src.html](../../../tutorial/source/setup/setup_599_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -7,8 +8,8 @@ ## Some observations -Because it is now centered on *pipelines* as much as on software packages, dependency management is different from other technologies including Java and NodeJS - how so? +Because it is now centered on *pipelines* as much as on files and software packages, dependency management is different from other technologies including Java and NodeJS - how so? MorganaXProc-III is implemented in Scala, and Saxon is built in Java, but otherwise distributions including the SchXSLT and XSpec distributions consist mainly of XSLT. This is either very good (with development and maintenance requirements in view), or not good at all. -How much of this is due to the high-level, abstracted nature of [4GLs](https://en.wikipedia.org/wiki/Fourth-generation_programming_language) including both XSLT 3.1 and XProc 3.0? \ No newline at end of file +How much of this is due to the high-level, abstracted nature of [4GLs](https://en.wikipedia.org/wiki/Fourth-generation_programming_language) including both XSLT 3.1 and XProc 3.0? diff --git a/tutorial/sequence/Lesson02/unpack_101.md b/tutorial/sequence/Lesson02/unpack_101.md index 310129ff..59043d31 100644 --- a/tutorial/sequence/Lesson02/unpack_101.md +++ b/tutorial/sequence/Lesson02/unpack_101.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/unpack/unpack_101_src.html](../../../tutorial/source/unpack/unpack_101_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -43,8 +44,8 @@ The second group of pipelines is a bit more interesting. Each of the utilities p Each smoke test performs a minor task, serving as a “smoke test” inasmuch as its only aim is to determine whether a simple representative process completes successfully. (When we plug in the board, can we see and smell smoke?) * [smoketest/TEST-XPROC3.xpl](../../../smoketest/TEST-XPROC3.xpl) amounts to an XProc “Hello World”. In that spirit, feel free to edit and adjust this file. -* [smoketest/SMOKETEST-XSLT.xpl](../../../smoketest/SMOKETEST-XSLT.xpl) tests Saxon, an XSLT/XQuery transformation engine. XSLT and XQuery are related technologies (different languages, same data model) developed with XML processing in mind, but in recent years generalized to a wider range of data structures. -* [smoketest/SMOKETEST-SCHEMATRON.xpl](../../../smoketest/SMOKETEST-SCHEMATRON.xpl) tests SchXSLT. SchXSLT is an implementation of Schematron, an ISO-standard validation and reporting technology. Schematron relies on XSLT, so this library requires Saxon. +* [smoketest/TEST-XSLT.xpl](../../../smoketest/TEST-XSLT.xpl) tests Saxon, an XSLT/XQuery transformation engine. XSLT and XQuery are related technologies (different languages, same data model) developed with XML processing in mind, but in recent years generalized to a wider range of data structures. +* [smoketest/TEST-SCHEMATRON.xpl](../../../smoketest/TEST-SCHEMATRON.xpl) tests SchXSLT. SchXSLT is an implementation of Schematron, an ISO-standard validation and reporting technology. Schematron relies on XSLT, so this library requires Saxon. * [smoketest/TEST-XSPEC.xpl](../../../smoketest/TEST-XSPEC.xpl) tests XSpec, an XSLT-based testing framework useful for testing deployments of XSLT, XQuery and Schematron. All these together comprise more than can be learned in an afternoon, or even a week. Any and each of them can nonetheless be used as a “black box” by any competent operator, even without understanding about internals. @@ -87,4 +88,4 @@ Also, see the official [XProc.org dashboard page](https://xproc.org). Also, check out XProc index materials (with code snips) produced in this repository: [XProc docs](../../../projects/xproc-doc/readme.md). Produced using XProc, these can be covered in detail in a later lesson unit. -There is [a book, Erik Siegel's XProc 3.0 Programmer's Reference](https://xmlpress.net/publications/xproc-3-0/) (2020). \ No newline at end of file +There is [a book, Erik Siegel's XProc 3.0 Programmer's Reference](https://xmlpress.net/publications/xproc-3-0/) (2020). diff --git a/tutorial/sequence/Lesson02/unpack_102.md b/tutorial/sequence/Lesson02/unpack_102.md index 73117dc2..86cff48f 100644 --- a/tutorial/sequence/Lesson02/unpack_102.md +++ b/tutorial/sequence/Lesson02/unpack_102.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/unpack/unpack_102_src.html](../../../tutorial/source/unpack/unpack_102_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -26,7 +27,7 @@ And the same pipelines you ran in setup: [Setup 101](../setup/setup_101.md). ## Prerequisites -You have done [Setup 101](../setup/setup_101.md), [Setup 102](../setup/setup_101.md) and [Unpack 101](unpack_101_src.html). +You have done [Setup 101](../setup/setup_101.md), [Setup 102](../setup/setup_101.md) and [Unpack 101](unpack_101.md). ## Learning about XProc @@ -49,7 +50,7 @@ Accommodating this design, an XProc *file* considered as an XML instance is eith Additionally, step declarations can include their own pipeline (step) declarations, making a hybrid architecture: the pipeline comprises a step, with its own library not imported but in line. This can be useful. -An example of a step library in this repository is [xpec-execute.xpl](../../../xspec/xspec-execute.xpl), which collects several steps supporting XSpec, one each for supporting the XSpec testing framework for XSLT, XQuery and Schematron respectively. +An example of a step library in this repository is [xspec-execute.xpl](../../../xspec/xspec-execute.xpl), which collects several steps supporting XSpec, one each for supporting the XSpec testing framework for XSLT, XQuery and Schematron respectively. The advantage of defining a step at the top level, rather than putting all steps into libraries, is that such a step can be invoked without prior knowledge of its type name, which is used by XProc to distinguish it from other steps. @@ -72,7 +73,7 @@ Fortunately, the vocabulary of the language is not very large. Core XProc has on #### XProc embedded documentation -An example of this is the XProc `p:documentation` element. This element is designed to carry documentation to a consuming application. Rather than mandate some kind of behavior for `p:documentation` – something difficult or impossible to do for the general case, or to test –- the XProc rule is “anything marked as documentation is for some other consumer”, i.e. a documentation engine, not the XProc processor. In other words, a conformant processor [must ignore anything it sees](https://spec.xproc.org/3.0/xproc/#documentation) inside `p:documentation`. +An example of this is the XProc `p:documentation` element. This element is designed to carry documentation to a consuming application. Rather than mandate some kind of behavior for `p:documentation` – something difficult or impossible to do for the general case, or to test –- the XProc rule is “anything marked as documentation is for some other consumer”, i.e. a documentation engine, not the XProc processor. In other words, a conformant processor [must ignore anything it sees](https://spec.xproc.org/3.0/xproc/#documentation) inside `p:documentation`. There is a small loophole, namely that the effect of `p:inline` for capturing XML overrides this provision, so if you put `p:documentation` inside `p:inline`, it “becomes visible” - as inline content, not as XProc to be operated on. @@ -80,13 +81,13 @@ There is a small loophole, namely that the effect of `p:inline` for capturing XM Keep in mind that every XProc pipeline is also, potentially and actually, a step. There are two things we need to know about steps - how to define them, and how to use them. -We begin with how to recognize and use steps, but we can't avoid how to define them: because an XProc pipeline is also an XProc step, we can't use steps without ending up with a pipeline. We have only to look at the working pipeline we make with our steps, to see how a step is made. +We begin with how to recognize and use steps. But because an XProc pipeline is also an XProc step, we can't use steps without ending up with a pipeline. We have only to look at the working pipeline we make with our steps, to see how a step is made. -As described in the [XProc 3.0 specification](https://spec.xproc.org/3.0/xproc/#declare-pipelines), XProc step declarations can be divided into an initial set of elements for setup and configuration, followed by what the specification calls a *subpipeline*, which is typically a sequence of steps to be executed – any steps available, which could be anything. Think of the subpipeline as the working parts of the pipeline, while the rest is all about how it is set up. +As described in the [XProc 3.0 specification](https://spec.xproc.org/3.0/xproc/#declare-pipelines), XProc step declarations can be divided into an initial set of elements for setup and configuration, followed by what the specification calls a *subpipeline*, consisting of a sequence of steps to be executed – any steps available, which could be anything. Think of the subpipeline as the working parts of the pipeline, while the rest is all about how it is set up. -The list of elements that come before the steps is short, which helps: `p:import`, `p:import-functions`, `p:input`, `p:output`, `p:option` or `p:declare-step`. Everything coming after is a step. +The list of elements that come before the subpipeline is short, which helps: `p:import`, `p:import-functions`, `p:input`, `p:output`, `p:option` or `p:declare-step`. Everything coming after is a step. -Within this set of elements (all preceding, none following the subpipeline) XProc further distinguishes between the **imports** for steps and functions, appearing first (elements `p:import` and `p:import-functions`), to be followed by elements configuring the step: `p:input`, `p:output`, `p:option` – elements together called the [prologue](https://spec.xproc.org/3.0/xproc/#declare-pipelines). +Within this set of elements (all preceding, none following the subpipeline) XProc further distinguishes between the **imports** for steps and functions, appearing first (elements `p:import` and `p:import-functions`), to be followed by elements configuring the step: `p:input`, `p:output`, `p:option` – elements together called the [prologue](https://spec.xproc.org/3.0/xproc/#declare-pipelines). The prologue is used to define ports and options for the pipeline - the points of control for its interfaces. (Technically: runtime bindings, and parameter or option settings.) If only a single input is needed, a single input port (named `source`) can be assumed, so prologues can be empty (and invisible, or not there). @@ -94,7 +95,7 @@ Following the prologue, a step may also have local step definitions (`p:declare- After imports, prologue and (optional) step declarations, the step sequence that follows comprises the [subpipeline](https://spec.xproc.org/3.0/xproc/#dt-subpipeline). -One other complication: for purposes of exposition, we have pretended that `p:variable` (a variable declaration) and `p:documentation` (for out-of-band documentation) are steps, which is not how the XProc recommendation describes them, although they appears in the subpipeline with and among its steps. +One other complication: among the steps in the subpipeline, `p:variable` (a variable declaration) and `p:documentation` (for out-of-band documentation) are also permitted – these are not properly steps, but can be useful to have with them. In summary: any XProc pipeline, viewed as a step declaration, can have the following -- @@ -102,7 +103,7 @@ In summary: any XProc pipeline, viewed as a step declaration, can have the follo * **Imports**: step declarations, step libraries and functions to make available * The pipeline **prologue**: any of the elements named `p:input`, `p:output` and `p:option`, defining this pipeline's ports and options * If no ports are named, assume a single `source` primary input port, permitting a single document -* Optionally (and not common): step declarations for local steps - each has its own name and type, prologue and steps +* Optionally (and not common): step declarations for local steps, appearing at `p:declare-step`. Each of these will have its own name, type, prologue and steps * For this pipeline, one or more steps, called the [subpipeline](https://spec.xproc.org/3.0/xproc/#dt-subpipeline) * Standard atomic and compound steps in XProc namespace (probably prefixed `p:`) * Imported steps - in their own namespaces (in this repository, prefixed `ox:`) @@ -113,9 +114,9 @@ NB: the pipelines run so far have XML comments demarcating the prologue from the ### Atomic and compound steps -Given an understanding of the organization of an XProc pipeline, all that remains to understand of its syntax is the steps themselves, which follow a common pattern. Briefly put, atomic steps are any steps you use by simply invoking it with inputs and options: its logic is self-contained, and the operation it carries out is (at least conceptually) “single”. Compound steps, instead, are used to execute more than one subpipeline, with settings determined dynamically for the step. +Given an understanding of the organization of an XProc pipeline, all that remains to understand of its syntax is the steps themselves, which follow a common pattern. Briefly put, atomic steps are any steps you use by simply invoking it with inputs and options: its logic is self-contained, and the operation it carries out is (at least conceptually) “single”. Compound steps, instead, are used to deploy more than one subpipeline, with settings determined dynamically for the step. -Fortunately XProc keeps things simple by providing only a few compound steps supporting the identified range of needs – and no way for users to define their own. This does not prove to be a practical limitation, since atomic steps can have multiple inputs and outputs, distinguished by type and role, and indeed since atomic steps used in a pipeline can be defined with compound steps in their own subpipelines, either externally or even within the same step declaration. +Fortunately XProc keeps things simple by providing only a few compound steps supporting the identified range of needs – and no way for users to define their own. This does not prove to be a practical limitation, since atomic steps can have multiple inputs and outputs, distinguished by type and role, and indeed since atomic steps used in a pipeline can be defined with compound steps in their own subpipelines, either externally or even within the same step declaration. Here are all the compound steps. All others are atomic steps. @@ -139,7 +140,7 @@ Answer: The [XSpec smoke test](./../../../smoketest/TEST-XSPEC.xpl) calls an ext ### Schema for XProc 3.0 -See the [599-level coverage in this lesson unit](unpack_599_src.html) for a discussion of the schema for XProc. +See the [599-level coverage in this lesson unit](unpack_599.md) for a discussion of the schema for XProc. ## Take note @@ -161,7 +162,7 @@ An XProc developer always knows where `href` is used in a pipeline, and how to t ## Exercise: Knowing what to look for -The last lesson unit already provided an opportunity to alter pipelines and see how they fail when not encoded correctly – when “broken”, any way we can think of breaking them. (Then we had an opportunity to put them back.) +The last lesson unit already provided an opportunity to alter pipelines and see how they fail when not encoded correctly – when “broken”, any way we can think of breaking them. (Then we had an opportunity to put them back.) After reading this page, do this again, except focusing on a few key areas: @@ -174,4 +175,4 @@ After reading this page, do this again, except focusing on a few key areas: After breaking anything, restore it to working order. Create modified copies of any pipelines for further analysis and discussion. -Concept: copy and change one of the pipelines provided to acquire a software library or resource of your choice. \ No newline at end of file +Concept: copy and change one of the pipelines provided to acquire a software library or resource of your choice. diff --git a/tutorial/sequence/Lesson02/unpack_599.md b/tutorial/sequence/Lesson02/unpack_599.md index e264aee1..5ac43373 100644 --- a/tutorial/sequence/Lesson02/unpack_599.md +++ b/tutorial/sequence/Lesson02/unpack_599.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/unpack/unpack_599_src.html](../../../tutorial/source/unpack/unpack_599_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -29,25 +30,25 @@ Same as [Setup 101](../setup/setup_101.md). Prior exercises, or the practical eq A schema for the XProc language, considered as core steps (compound and atomic) plus optional community-defined steps, is referenced from the [XProc Specification](https://spec.xproc.org/3.0/xproc/#ancillary-files). [This RNG schema](https://spec.xproc.org/3.0/xproc/xproc30.rng) is very useful. -It may often be considered gratuitous to validate XProc files against a schema, when the application (for us, Morgana)must in any case take responsibility for conformance issues, as it sees fit. The reference schema becomes useful if we find or suspect bugs in Morgana, but until then it need not have any direct role in any runtime operation. +It may often be considered gratuitous to validate XProc files against a schema, when the application (for us, Morgana) must in any case take responsibility for conformance issues, as it sees fit. The reference schema becomes useful if we find or suspect bugs in Morgana, but until then it need not have any direct role in any runtime operation. Nevertheless the RNG schema still serves as a reference and an object for querying -- queries whose results tell us about XProc. [A pipeline](../../GRAB-XPROC-RESOURCES.xpl) for acquiring both RNG schema and its RNC (compact syntax) variant is provided for interest and possible later use. ## XPath -Like other XDM-based technologies, XProc embeds and incorporates XPath, an expression language for XML. XPath 3.0 is a functional language in its own right, although not designed for end-to-end processing of encoded source data into encoded results, but only for certain critical operations that ordinarily need to be performed within such end-to-end processing. Since it is partial in this way, XPath is defined not in terms of any data notation (such as XML syntax or any other) but rather against an *abstract data object*, namely an [XDM](https://www.w3.org/TR/xpath-datamodel/) instance (XML data model), a putative information object that may be provided to the system by parsing an XML (syntax) instance, or by other means. As the query language for [XDM](https://www.w3.org/TR/xpath-datamodel/) and the basis for XQuery, [XPath](https://www.w3.org/TR/xpath-31/) is the “other half” of the data model, which any architect of a system using this technology must know. Learning XPath equips you mentally for dealing with the XDM in XQuery, XSLT, XProc or anywhere you find it. +Like other XDM-based technologies, XProc embeds and incorporates XPath, an expression language for XML. XPath 3.0 is a functional language in its own right, although not designed for end-to-end processing of encoded source data into encoded results, but only for certain critical operations that ordinarily need to be performed within such end-to-end processing. Importantly, XPath is defined not in terms of any data notation (such as XML syntax or any other) but rather against an *abstract data object*, namely an [XDM](https://www.w3.org/TR/xpath-datamodel/) instance (XML data model), a putative information object that may be provided to the system by parsing an XML (syntax) instance, or by other means. As the query language for [XDM](https://www.w3.org/TR/xpath-datamodel/) and the basis for XQuery, [XPath](https://www.w3.org/TR/xpath-31/) is the “other half” of the data model, which any architect of a system using this technology must know. Learning XPath equips you mentally for dealing with the XDM in XQuery, XSLT, XProc or anywhere you find it. For those not already familiar with XPath, on line resources can be helpful. Keep in mind that [XPath 3.1](https://www.w3.org/TR/xpath-31/) outstrips XPath 1.0 in many important respects. ### Documents and data -One of the more important features of XPath and the XDM is that they are designed not only to meet needs for the representation and transmission of structured data. A specialized class of data formats has evolved that represent information in ways that are not “unstructured”, but that contrast with more common or usual structures of data formats, whether they be tabular data, serialization formats for object models, or some other regular and fore-ordained arrangement. One might say “common” or “usual” with reservation, since of course documents are not uncommon where they are common. +One of the more important features of XPath and the XDM is that they are designed not only to meet needs for the representation and transmission of structured data. A specialized class of data formats has evolved that represent information in ways that are not “unstructured”, but that contrast with more common or usual structures of data formats, whether they be tabular data, serialization formats for object models, or some other regular (formalized and codified) arrangement. One might say “common” or “usual” with reservation, since of course documents are not uncommon where they are common. We see a great deal of structured data these days if only because it is so easy to make structured data with machines, and we now have the machines. What remains difficult is to translate what has not been created by a machine, into a form that a machine can “recognize”, or rather into a form we can recognize in and with the machine, without destroying it. So documents are called “unstructured” but they might better be called “relatively irregular”, meaning not that they have no structure, but that each one is structured in itself, and moreover, likely to be incompatible or not fully compatible with encodings designed to capture other structures. -And to the extent this is the case, any encoding capable of describing documents must have the capability of supporting each document's own distinctive structure and organization, whether that be due to its family (what is called a **document type**) or an expression of its own intrinsic logic. The format must be not only structured, but *structurable*, and its structures must to some extent be capable of self-description – combining data with metadata. +And to the extent this is the case, any encoding capable of describing documents must have the capability of supporting each document's own distinctive structure and organization, whether that be due to its family (what is called a **document type**) or an expression of its own intrinsic logic. The format must be not only structured, but *structurable*, and its structures must to some extent be capable of self-description – combining data with metadata. And this is to give no consideration to the fact that these structures can be described at *multiple levels* of generality or specificity with regard to either their supposed semantics, or their configuration in operation. @@ -55,7 +56,7 @@ Documentary data formats especially markup formats are designed to work in this And so we get XPath - a query syntax which permits working with an organized structure of a particular kind (an *XDM document tree*), which in turn is designed for handling the combination of *highly regular* and *quite irregular* data structures that characterize information sets we (loosely) call **documentary**. -A definition for what is a document is out of scope for this tutorial – an interesting topic but not only a technical one. +A definition for what is a document is out of scope for this tutorial – an interesting topic but not only a technical one. ## Survey of XProc elements @@ -63,6 +64,10 @@ All elements defined by XProc are listed in this analytical breakout. TODO - tbd - reformat this table for legibility (CSS grids); validate its completeness against XProc RNG? +NB - XProc 3.1 makes this a moving target. + +NB also – see Erik Siegel's [XProcRef](https://xprocref.org/index.html) indexing project for more detailed summaries. + | Function | XProc elements / p: namespace | | Documentation | `p:documentation`, , | | Top-level | `p:declare-step`, `p:library` | @@ -86,11 +91,11 @@ TODO - tbd - reformat this table for legibility (CSS grids); validate its comple | Year | Publication | Capabilities | Processing frameworks | Platforms | | --- | --- | --- | --- | --- | -| 1987 | SGML (ISO-IEC 8879-1) | parsing logic; schema validation; configurable syntax; tree of elements and attributes | Proprietary stacks | Mainframes, workstations | +| 1987 | SGML (ISO-IEC 8879-1) | parsing logic; schema validation; configurable syntax; (implicit) tree of elements and attributes | Proprietary stacks | Mainframes, workstations | | 1998 | XML 1.0 | standard syntax | Batch processing, shell scripts, `make` | Mainframes, workstations, PCs (x86 generation) | | 1996 | Unicode 2.0 | standard character sets | Support for Unicode is slow to come | | | 1999 | XPath 1.0, XSLT 1.0 | basic tree querying and transformations (down hill); functional support for namespaces | Web browsers? (some, sort of) | | -| 2000 | | | Apache Ant | Java | +| 2000 | | XML-configured software builds | Apache Ant | Java | | | XQuery 1.0 | | Perl, Python, Java APIs / integration | | | | XPath 2.0 | | Server frameworks (Apache Cocoon) | | | 2001 | XML Schema Definition language (XDM) | Standardizes atomic data types (foundations of XSD); namespace-based validation (RNG also offers this, 2001-2002) | | | @@ -126,17 +131,17 @@ This is not the place to learn XPath, but a selection of XPath expressions can o | `//p[10]` | All `p` elements, that are the tenth `p` inside their respective parents | `/descendant-or-self::element()/child::p[position() eq 10]` | | `//section[count(.//p) gt 10]` | All `section` elements that contain more than 10 `p` elements, at any depth | `/child::section[count(self::node()/descendant-or-self::element()/child::p) gt 10]` | -## XML and XDM: context and rationale +## XML and the XDM: context and rationale * Standard, non-proprietary and freely available without restriction * Consistently and repeatedly shown to be capable at scale (size/complexity) -* Supported by commodity tools, easing problem of proprietary product endorsement +* Supported by commodity tools, easing problem of proprietary product dependencies -The technologies we rely on share a common foundation in XML and XDM, technologies developed under the auspices of the World Wide Web Consortium. +The technologies we rely on share a common foundation in XML and XDM (the XML data model), technologies developed under the auspices of the World Wide Web Consortium. -They are commodity tools in the sense that they are freely available to use without restriction, an important qualification for this distribution, which has a prior commitment *not to endorse particular technological solutions to any problem*, however posed or circumscribed. Accordingly, solutions here are not offered as recommendations, but rather as stipulations of (minimum) viable functionality in tools or capabilities, and not only using tools as “black boxes”, but under control and conformant to external specifications – i.e., standards. +These are supported by commodity tools that are freely available to use without restriction, an important qualification for this distribution, which has a prior commitment *not to endorse particular technological solutions to any problem*, however posed or circumscribed. Accordingly, solutions here are not offered as recommendations, but rather as stipulations of (minimum) viable functionality in tools or capabilities, and not only using tools as “black boxes”, but under control and conformant to external specifications – i.e., standards. -Users of these tools should keep in mind the model whereby we imagine the viability of a tools market and ecosystem that enables both large and small software developers including independent developers, academic researchers, and students, to participate meaningfully, finding an appropriate value or service proposition to provide their long-term goals. Translated, this means the tools must be capable enough for industrial use at scale, while also “scale down” to demonstration or classroom use. +Users of these tools should keep in mind the model whereby we imagine the viability of a tools market and ecosystem that enables both large and small software developers – including independent developers, academic researchers, and students – to participate meaningfully, finding an appropriate value or service proposition to support immediate and long-term goals. Translated, this means the tools must be capable enough for industrial use at scale, while they must also “scale down” to demonstration or classroom use. In web standards including HTML and Javascript (ECMAScript) we arguably have the beginnings of such an ecosystem, while it is also contested and turbulent. Within the publishing sector more broadly and intersecting with the web, the XML family of standards arguably provides the best demonstration of complete or near-complete capabilities at least with respect to the harder problems of document processing. @@ -155,4 +160,4 @@ Initiated in 1996, XML continues to be generative in 2024. ## Exercise: Discussion board -Create or contribute to a Github discussion board offering perspective or (especially!) relevant information or experience on any of the larger questions. \ No newline at end of file +Create or contribute to a Github discussion board offering perspective or (especially!) relevant information or experience on any of the larger questions. diff --git a/tutorial/sequence/Lesson03/oscal-convert_101.md b/tutorial/sequence/Lesson03/oscal-convert_101.md index d6d58af8..ba3ca765 100644 --- a/tutorial/sequence/Lesson03/oscal-convert_101.md +++ b/tutorial/sequence/Lesson03/oscal-convert_101.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-convert/oscal-convert_101_src.html](../../../tutorial/source/oscal-convert/oscal-convert_101_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -17,15 +18,23 @@ You have succeeded in prior exercises, including tools installation and setup. ## Resources -This unit relies on the [oscal-convert project](../../../projects/oscal-convert/readme.md) in this repository, with its files. Like all projects in the repo, it is designed to be self-contained and self-explanatory to the extent practical. Use your search engine and XProc resources to learn background and terminology. +This unit relies on the [oscal-convert project](../../../projects/oscal-convert/readme.md) in this repository, with its files. Like all projects in the repo, it aims to be reasonably self-contained and self-explanatory. Use your search engine and XProc resources to learn background and terminology. Also like other projects, there are preliminaries for acquiring resources, along with pipelines to run. +## Step zero: an identity pipeline + ## Step one: convert some OSCAL XML into OSCAL JSON [An acquisition pipeline](../../../projects/oscal-convert/GRAB-RESOURCES.xpl) in the project folder collects some OSCAL onto the local system, where it can be managed, easily inspected, controlled, and edited if necessary. -But sources and results from a conversion process do not always have to work with local resources. XProc sees the Internet itself - whatever protocols are supported by the processor (the `file` and `http` protocols are required for conformance) work as they do on the Worldwide Web. Of course, permissions must be in place to read and write files from and into file system locations. But when authentication is configured or resources are openly available, using `http` to reach resources or sources can be a very convenient option. +TBD / this all incoherent so far + +### The playing field is the internet + +Keep in mind that XProc in theory, and your XProc engine in practice, may read its inputs using whatever protocols it supports, while the `file` and `http` protocols are required for conformance, and work as they do on the Worldwide Web. Of course, permissions must be in place to read and write files from and into file system locations. But when authentication is configured or resources are openly available, using `http` to reach resources or sources can be a very convenient option. + +Keep in mind that where resources take the form of serializations of structured data such as XML or JSON, what is “read” (in the sense of presented to a consuming application) may not be quite exactly the same data serialization, since as a serialization, it is parsed into an object or representation of some kind, TBD - TODO - question - how many and of what sort of source data files - so far there is only the cat catalog @@ -41,7 +50,7 @@ Two ways: separate pipeline; and single pipeline; also a 'switcher' pipeline? If your criticism of XProc so far is that it makes it look easy when it isn't, you have a point. Conversion from XML to JSON isn't free, assuming it works at all. In this case, the heavy lifting is done by the XSLT component - the Saxon engine invoked by the `p:xslt` step, applying logic defined in an XSLT stylesheet (aka transformation) stored elsewhere. It happens that a converter for OSCAL data is available in XSLT, so rather than having to confront this considerable problem ourselves, we drop that in. -In later units we will see how using the XProc steps described, rudimentary data manipulations can be done using XProc by itself, without entailing the use of either XSLT or XQuery (another capability invoked with a different step). At the same time, while pipelines are based on the idea of passing data through a series of processes, there are many cases where logic is sufficiently complex that it becomes essential to maintain – and test – that logic externally from the XProc. At what point it becomes more efficient to encapsulate logic separately (whether by XSLT, XQuery or other means), depends very much on the case. +In later units we will see how using the XProc steps described, rudimentary data manipulations can be done using XProc by itself, without entailing the use of either XSLT or XQuery (another capability invoked with a different step). At the same time, while pipelines are based on the idea of passing data through a series of processes, there are many cases where logic is sufficiently complex that it becomes essential to maintain – and test – that logic externally from the XProc. At what point it becomes more efficient to encapsulate logic separately (whether by XSLT, XQuery or other means), depends very much on the case. The `p:xslt` pipeline step in particular is so important for real-world uses of XProc that it is introduced early, to show such black-box application. XProc also makes a fine environment for testing XSLT developed or acquired to handle specific tasks, a topic covered in more depth later. Indeed XSLT and XQuery being, like XProc itself, declarative languages, it makes sense to factor them out while maintaining easy access and transparency for analysis and auditing purposes. @@ -59,4 +68,4 @@ One way to manage the problem of ensuring input quality is to validate on the wa In the [publishing demonstration project folder](../../../projects/oscal-publish/publish-oscal-catalog.xpl) is an XProc that valides XML against an OSCAL schema, before formatting it. The same could be done for an XProc that converts the data into JSON - either or both before or after conversion. -Learn more about recognizing and dealing with errors in [Lesson 102](oscal-convert_102_src.html), or continue on to the next project, oscal-validate, for more on validation of documents and sets of documents. \ No newline at end of file +Learn more about recognizing and dealing with errors in [Lesson 102](oscal-convert_102.md), or continue on to the next project, oscal-validate, for more on validation of documents and sets of documents. diff --git a/tutorial/sequence/Lesson03/oscal-convert_102.md b/tutorial/sequence/Lesson03/oscal-convert_102.md index 7357c23f..d63e7ec0 100644 --- a/tutorial/sequence/Lesson03/oscal-convert_102.md +++ b/tutorial/sequence/Lesson03/oscal-convert_102.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-convert/oscal-convert_102_src.html](../../../tutorial/source/oscal-convert/oscal-convert_102_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -19,7 +20,7 @@ Run the pipelines described in [the 101 Lesson](https://github.co ## Resources -Same as the [101 lesson](oscal-convert_101_src.html). +Same as the [101 lesson](oscal-convert_101.md). ## Probing error space - data conversions @@ -61,4 +62,4 @@ Such a script could live in the project directory - do we want an Issue for this see [](https://spec.xproc.org/master/head/xproc/#err.inline.D0012) it is up to implementations to define supported URI schemes - also XML catalogs -## for 599: round tripping as process test \ No newline at end of file +## for 599: round tripping as process test diff --git a/tutorial/sequence/Lesson04/oscal-validate_101.md b/tutorial/sequence/Lesson04/oscal-validate_101.md index 08646584..b751a637 100644 --- a/tutorial/sequence/Lesson04/oscal-validate_101.md +++ b/tutorial/sequence/Lesson04/oscal-validate_101.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-validate/oscal-validate_101_src.html](../../../tutorial/source/oscal-validate/oscal-validate_101_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -38,11 +39,11 @@ The project contains pipelines that perform validation. Any description that app There are those who will look at a screen with a traceback with equanimity and dispassion - and those who will recoil. Maybe you are one of the fearless, maybe even one of the curious. Open the pipeline code in a programmer's text editor or IDE (integrated development environment) and get a sense of just how malleable it is. -XML comment syntax takes the form of angle-bracketed text with dashes (hyphens) and a bang: ``. You will see comments throughout the code examples, sometimes as inline documentation, and sometimes for entire blocks of inactive code. +XML comment syntax takes the form of angle-bracketed text with dashes (hyphens) and a bang: ``. You will see comments throughout the code examples, sometimes as inline documentation, and sometimes for entire blocks of inactive code. The intrepid explorer will try both *tweaking*, around the edges, then *adapting*, with new ideas. -The best of it is, as you learn how **a traceback is a tasty treat**, you enter a virtuous learning cycle. Repair a few bugs and you might get a taste for it. (Try the [102 Lesson unit ](oscal-validate_102_src.html)) +The best of it is, as you learn how **a traceback is a tasty treat**, you enter a virtuous learning cycle. Repair a few bugs and you might get a taste for it. (Try the [102 Lesson unit ](oscal-validate_102.md)) If you'd rather keep your feet dry, advance to the next Lesson. @@ -76,7 +77,7 @@ For the same reason, this class of problems is usually found early in pipeline d The more interesting class of problems is what are called “validation errors”, which somewhat confusingly represents that class of problems that result not from files that are syntactically erroneous and therefore cannot be read, but more subltly, in data instances that can be read, but that when read, are found to fail to conform to expectations, as expressed in an applicable rules set. -Such a rules set is called a “schema” and deploying a schema to impose regularity and predictability over an open-ended body of data – including data that has not yet been created – is a primary responsibility of an entity that seeks to define an interoperable language, supporting robust data interchange across organizational boundaries. +Such a rules set is called a “schema” and deploying a schema to impose regularity and predictability over an open-ended body of data – including data that has not yet been created – is a primary responsibility of an entity that seeks to define an interoperable language, supporting robust data interchange across organizational boundaries. ### When you know your schema @@ -96,4 +97,4 @@ OSCAL deploys a range of models, each with its own schemas (for XML and JSON var At time of writing this tutorial is very rough, with very much extension and refinement remaining to be done. -Tell us what we are doing right and wrong so far. Help us understand where things need to be explained, or better, illuminated by saying less - where is it too thick. \ No newline at end of file +Tell us what we are doing right and wrong so far. Help us understand where things need to be explained, or better, illuminated by saying less - where is it too thick. diff --git a/tutorial/sequence/Lesson04/oscal-validate_102.md b/tutorial/sequence/Lesson04/oscal-validate_102.md index 9517e74d..59cc3702 100644 --- a/tutorial/sequence/Lesson04/oscal-validate_102.md +++ b/tutorial/sequence/Lesson04/oscal-validate_102.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-validate/oscal-validate_102_src.html](../../../tutorial/source/oscal-validate/oscal-validate_102_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -57,4 +58,4 @@ other workflows and orchestrations - using schema validation as gateway setting schema validation to require-valid=false and using try/catch to trap - as a way of annotating instances on the way through (schema-field-tests) -## 599: some XProc features \ No newline at end of file +## 599: some XProc features diff --git a/tutorial/sequence/Lesson05/oscal-publish_101.md b/tutorial/sequence/Lesson05/oscal-publish_101.md index 072c7dd3..3c72c21e 100644 --- a/tutorial/sequence/Lesson05/oscal-publish_101.md +++ b/tutorial/sequence/Lesson05/oscal-publish_101.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-publish/oscal-publish_101_src.html](../../../tutorial/source/oscal-publish/oscal-publish_101_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -27,4 +28,4 @@ Additionally if you have your own OSCAL to “print”, especially OSCAL ## Step one: produce HTML -## Step two: edit and adjust \ No newline at end of file +## Step two: edit and adjust diff --git a/tutorial/sequence/Lesson05/oscal-publish_102.md b/tutorial/sequence/Lesson05/oscal-publish_102.md index 08e22b1e..72b684ad 100644 --- a/tutorial/sequence/Lesson05/oscal-publish_102.md +++ b/tutorial/sequence/Lesson05/oscal-publish_102.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-publish/oscal-publish_102_src.html](../../../tutorial/source/oscal-publish/oscal-publish_102_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -9,11 +10,11 @@ ## Prerequisites -Run the pipelines described in [the 101 Lesson](oscal-publish_101_src.html) +Run the pipelines described in [the 101 Lesson](oscal-publish_101.md) ## Resources -Like the [101 lesson](oscal-publish_101_src.html), this lesson unit uses the [oscal-import project](../../../projects/oscal-publish/readme.md) in this repo. +Like the [101 lesson](oscal-publish_101.md), this lesson unit uses the [oscal-import project](../../../projects/oscal-publish/readme.md) in this repo. Publishing your own OSCAL in these pipelines is also worth trying - the worst they can do is fail. Bring OSCAL, especially OSCAL catalogs. @@ -21,4 +22,4 @@ OSCAL JSON catalogs can be accommodated by splicing together a conversion pipeli ## Step One: any old OSCAL catalog -## Step Two: publishing OSCAL JSON \ No newline at end of file +## Step Two: publishing OSCAL JSON diff --git a/tutorial/sequence/Lesson06/oscal-produce_101.md b/tutorial/sequence/Lesson06/oscal-produce_101.md index 0ba68730..991dd8e2 100644 --- a/tutorial/sequence/Lesson06/oscal-produce_101.md +++ b/tutorial/sequence/Lesson06/oscal-produce_101.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-produce/oscal-produce_101_src.html](../../../tutorial/source/oscal-produce/oscal-produce_101_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -29,7 +30,7 @@ Additionally if you have your own OSCAL to bring, especially OSCAL catalogs, bri ## Step one: acquire resources -As usual, the project contains pipelines to be used to acquire copies of resources, placing them in the project lib directory . These may include dependencies for steps in the pipeline (read details in the [102 lesson](oscal-produce_102_src.html)) so it is a good idea to run them all. +As usual, the project contains pipelines to be used to acquire copies of resources, placing them in the project lib directory . These may include dependencies for steps in the pipeline (read details in the [102 lesson](oscal-produce_102.md)) so it is a good idea to run them all. These include a pipeline that copies the PDF original from which the HTML input (next step) was derived, using a COTS (commercial off-the-shelf) tool. Inspect and read this PDF to see what the upstream data looks like - and get a sense of what the data set looks like when the structures are “painted” on the page. @@ -45,9 +46,9 @@ Compare this to the PDF document you have downloaded (or the document on line). *Do not delete, replace, rename or alter this file*, as all the subsequent processing is tuned specifically to it, its internal organization, regularities and anomalies. Another process input - even an HTML file showing the same text (to any definition of “same”) - is highly unlikely to deliver acceptable results from the pipeline. This is an important factor to keep in mind when considering the scalability of the operation demonstrated. Producing a clean and legible *encoding* for the document does not require less expertise than producing the original; in some ways (for example with respect to knowledge of text encoding formats) it requires more. -For some data sets, however, even a bespoke transformation pipeline such as this can be profitable, even beyond its impacts in greater availability and utility of the information. The expense and effort may be warranted when the source document is of such high quality and consistency instrinsically, that exposing its “native semantics” via a rational and explicable text encoding - a standards-based, platform- and application-independent encoding - such as OSCAL - becomes attractive for the specific kinds of affordances – the leverage – it gives for processing the information. In FM 6-22 Chapter 4, we have exactly such a document, which fits well into standards-based documentary formats such as NISO STS and, eventually, OSCAL. +For some data sets, however, even a bespoke transformation pipeline such as this can be profitable, even beyond its impacts in greater availability and utility of the information. The expense and effort may be warranted when the source document is of such high quality and consistency instrinsically, that exposing its “native semantics” via a rational and explicable text encoding - a standards-based, platform- and application-independent encoding - such as OSCAL - becomes attractive for the specific kinds of affordances – the leverage – it gives for processing the information. In FM 6-22 Chapter 4, we have exactly such a document, which fits well into standards-based documentary formats such as NISO STS and, eventually, OSCAL. -Because PDF is relatively opaque, extracting data from a PDF file with format intact is not a trivial exercise. PDF is arguably not a “data format” at all, but a language used to control a device for casting pixels and glyphs onto a page or screen. This being its purpose, no tool can do more – at least without the benefit of an external information source – than create outputs that *appear* to present the document with its organization and information intact, if rendered on screen with an appropriate tool (such as, in the case of an HTML rendition of the page, a web browser). In so doing it may meet a low baseline of functional requirement - the document is legible - while failing to meet others. In particular: failing to meet requirements for clean and well-structured data fit for reuse in a broad range of scenarios and applications, not only page production. +Because PDF is relatively opaque, extracting data from a PDF file with format intact is not a trivial exercise. PDF is arguably not a “data format” at all, but a language used to control a device for casting pixels and glyphs onto a page or screen. This being its purpose, no tool can do more – at least without the benefit of an external information source – than create outputs that *appear* to present the document with its organization and information intact, if rendered on screen with an appropriate tool (such as, in the case of an HTML rendition of the page, a web browser). In so doing it may meet a low baseline of functional requirement - the document is legible - while failing to meet others. In particular: failing to meet requirements for clean and well-structured data fit for reuse in a broad range of scenarios and applications, not only page production. Indeed this HTML file makes an excellent example of the kind of rather-poor encoding produced by a market-leading HTML export utility. Experts in data conversion might find other ways to make better encoding from the PDF - a task out of scope for us. (As we are not trying to find the best export utility, but on the contrary to demonstrate methods available so we do not have to do so.) This HTML is good enough, and that is what is often available. @@ -62,4 +63,4 @@ Two files are created, both representing the Field Manual, each in a different f * NISO STS (Standards Tag Suite) format describes the full text, with tables, in XML * OSCAL (Open Security Controls Assessment Language) factors out a richer “semantic” view of the data in OSCAL format, again presenting the full text of Chapter 4, but this time with externalized control sets, representing 25 **attributes** and 50 **competencies** as these are described in Field Manual 6-22 and its related documents such as ADRP 6-22 (describing the US Army Leadership Requirements Model). -## Step four (optional): run the pipeline in diagnostic mode \ No newline at end of file +## Step four (optional): run the pipeline in diagnostic mode diff --git a/tutorial/sequence/Lesson06/oscal-produce_102.md b/tutorial/sequence/Lesson06/oscal-produce_102.md index 5ebb3955..ff7014cb 100644 --- a/tutorial/sequence/Lesson06/oscal-produce_102.md +++ b/tutorial/sequence/Lesson06/oscal-produce_102.md @@ -1,4 +1,5 @@ + > *Warning:* this Markdown file will be rewritten under continuous deployment (CD): edit the source in [/tutorial/source/oscal-produce/oscal-produce_102_src.html](../../../tutorial/source/oscal-produce/oscal-produce_102_src.html). > > Save this file elsewhere to create a persistent copy (for example, for purposes of annotation). @@ -15,11 +16,11 @@ See an example of how an XProc pipeline can integrate validation to provide runt ## Prerequisites -Run the pipelines described in [the 101 Lesson](oscal-produce_101_src.html) +Run the pipelines described in [the 101 Lesson](oscal-produce_101.md) ## Resources -Like the [101 lesson](oscal-produce_101_src.html), this lesson unit uses the [oscal-import project](../../../projects/oscal-import/readme.md) in this repo. +Like the [101 lesson](oscal-produce_101.md), this lesson unit uses the [oscal-import project](../../../projects/oscal-import/readme.md) in this repo. ## Step one: run the pipeline in diagnostic mode @@ -84,4 +85,4 @@ To display an STS document in a browser for reference or proofreading, an STS ap ## Step three: break and repair -## Step four: research XSLT \ No newline at end of file +## Step four: research XSLT diff --git a/tutorial/sequence/lesson-sequence.md b/tutorial/sequence/lesson-sequence.md index 4a036807..4f38c858 100644 --- a/tutorial/sequence/lesson-sequence.md +++ b/tutorial/sequence/lesson-sequence.md @@ -1,37 +1,33 @@ + ### Lesson unit 01 * [101: Project setup and installation](Lesson01/setup_101.md) * [102: Examining the setup](Lesson01/setup_102.md) * [599: Meeting XProc](Lesson01/setup_599.md) - ### Lesson unit 02 * [101: Unpacking XProc 3.0](Lesson02/unpack_101.md) * [102: XProc fundamentals](Lesson02/unpack_102.md) * [599: More context](Lesson02/unpack_599.md) - ### Lesson unit 03 * [101: OSCAL from XML to JSON and back](Lesson03/oscal-convert_101.md) * [102: Hands on data conversions](Lesson03/oscal-convert_102.md) - ### Lesson unit 04 * [101: Seeing valid OSCAL](Lesson04/oscal-validate_101.md) * [102: Validating OSCAL](Lesson04/oscal-validate_102.md) - ### Lesson unit 05 * [101: Some OSCAL publishing](Lesson05/oscal-publish_101.md) * [102: More OSCAL Publishing](Lesson05/oscal-publish_102.md) - ### Lesson unit 06 * [101: Producing OSCAL from a publication format](Lesson06/oscal-produce_101.md) diff --git a/tutorial/source/oscal-convert/oscal-convert_101_src.html b/tutorial/source/oscal-convert/oscal-convert_101_src.html index 41d14672..a3b20928 100644 --- a/tutorial/source/oscal-convert/oscal-convert_101_src.html +++ b/tutorial/source/oscal-convert/oscal-convert_101_src.html @@ -2,6 +2,7 @@ 101: OSCAL from XML to JSON and back +

101: OSCAL from XML to JSON and back

@@ -17,23 +18,48 @@

Prerequisites

Resources

-

This unit relies on the oscal-convert project in this - repository, with its files. Like all projects in the repo, it is designed to be self-contained and - self-explanatory to the extent practical. Use your search engine and XProc resources to learn background and - terminology.

+

This unit relies on the oscal-convert project in + this repository, with its files. Like all projects in the repo, it aims to be reasonably self-contained and + self-explanatory. Use your search engine and XProc resources to learn background and terminology.

Also like other projects, there are preliminaries for acquiring resources, along with pipelines to run.

+
+

Step zero: an identity pipeline

+

To verify syntactic correctness (well-formedness) - does it parse?

+

To transcode a file from one encoding to another

+

Any reader who feels a 599 lesson on encodings and XProc should pipe up! (Feel free to post an Issue, + Discussion, or PR with a draft.)

+
+
+

Step zero-point-five: XML to JSON and back

+

XML and JSON are both data serializations, a term that designates how each of them is to be + considered and treated – irrespective of any questions of information storage – as a sequence of + characters. This is a very important commonality, which makes it possible to bring them together in a + single processing environment such as XProc.

+

Along with plain text, perhaps the most important data serialization or format as we call + them, of the three.

+

A simple XProc pipeline can be used to demonstrate this. While doing so, it shows also while this is not as + simple a process as it seems. Merely to convert from format to format is not enough.

+

Step one: convert some OSCAL XML into OSCAL JSON

An acquisition pipeline in the project folder collects some OSCAL onto the local system, where it can be managed, easily inspected, controlled, and edited if necessary.

-

But sources and results from a conversion process do not always have to work with local resources. XProc - sees the Internet itself - whatever protocols are supported by the processor (the file and - http protocols are required for conformance) work as they do on the Worldwide Web. Of - course, permissions must be in place to read and write files from and into file system locations. But when - authentication is configured or resources are openly available, using http to reach resources - or sources can be a very convenient option.

+

TBD / this all incoherent so far

+
+

The playing field is the internet

+

Keep in mind that XProc in theory, and your XProc engine in practice, may read its inputs using whatever + protocols it supports, while the file and http protocols are required for + conformance, and work as they do on the Worldwide Web. Of course, permissions must be in place to read + and write files from and into file system locations. But when authentication is configured or resources + are openly available, using http to reach resources or sources can be a very convenient + option.

+

Keep in mind that where resources take the form of serializations of structured data such as XML or JSON, + what is read (in the sense of presented to a consuming application) may not be quite exactly the + same data serialization, since as a serialization, it is parsed into an object or representation of some + kind,

+

TBD - TODO - question - how many and of what sort of source data files - so far there is only the cat catalog

diff --git a/tutorial/source/oscal-convert/oscal-convert_102_src.html b/tutorial/source/oscal-convert/oscal-convert_102_src.html index b1d4e18f..52b55d2c 100644 --- a/tutorial/source/oscal-convert/oscal-convert_102_src.html +++ b/tutorial/source/oscal-convert/oscal-convert_102_src.html @@ -2,6 +2,7 @@ 102: Hands on data conversions +

102: Hands on data conversions

@@ -20,7 +21,7 @@

Prerequisites

Resources

-

Same as the 101 lesson.

+

Same as the 101 lesson.

Probing error space - data conversions

diff --git a/tutorial/source/oscal-produce/oscal-produce_101_src.html b/tutorial/source/oscal-produce/oscal-produce_101_src.html index 14400236..8187f58c 100644 --- a/tutorial/source/oscal-produce/oscal-produce_101_src.html +++ b/tutorial/source/oscal-produce/oscal-produce_101_src.html @@ -2,6 +2,7 @@ 101: Producing OSCAL from a publication format +

101: Producing OSCAL from a publication format

@@ -41,7 +42,7 @@

Resources

Step one: acquire resources

As usual, the project contains pipelines to be used to acquire copies of resources, placing them in the project lib directory . These may include dependencies for steps in the pipeline (read details in the 102 lesson) so it is a good idea to run them all.

+ href="oscal-produce_102_src.html" class="LessonUnit">102 lesson) so it is a good idea to run them all.

These include a pipeline that copies the PDF original from which the HTML input (next step) was derived, using a COTS (commercial off-the-shelf) tool. Inspect and read this PDF to see what the upstream data looks like - and get a sense of what the data set looks like when the structures are painted on the diff --git a/tutorial/source/oscal-produce/oscal-produce_102_src.html b/tutorial/source/oscal-produce/oscal-produce_102_src.html index fdda0dc2..c9747647 100644 --- a/tutorial/source/oscal-produce/oscal-produce_102_src.html +++ b/tutorial/source/oscal-produce/oscal-produce_102_src.html @@ -2,6 +2,7 @@ 102: Producing OSCAL from uncooked data +

102: Producing OSCAL from uncooked data

@@ -16,11 +17,11 @@

Goals

Prerequisites

-

Run the pipelines described in the 101 Lesson

+

Run the pipelines described in the 101 Lesson

Resources

-

Like the 101 lesson, this lesson unit uses the Like the 101 lesson, this lesson unit uses the oscal-import project in this repo.

diff --git a/tutorial/source/oscal-publish/oscal-publish_101_src.html b/tutorial/source/oscal-publish/oscal-publish_101_src.html index 0af76b06..58b9723f 100644 --- a/tutorial/source/oscal-publish/oscal-publish_101_src.html +++ b/tutorial/source/oscal-publish/oscal-publish_101_src.html @@ -2,7 +2,7 @@ 101: Some OSCAL publishing - +

101: Some OSCAL publishing

diff --git a/tutorial/source/oscal-publish/oscal-publish_102_src.html b/tutorial/source/oscal-publish/oscal-publish_102_src.html index 1299ed94..560850c0 100644 --- a/tutorial/source/oscal-publish/oscal-publish_102_src.html +++ b/tutorial/source/oscal-publish/oscal-publish_102_src.html @@ -2,6 +2,7 @@ 102: More OSCAL Publishing +

102: More OSCAL Publishing

@@ -10,11 +11,11 @@

Goals

Prerequisites

-

Run the pipelines described in the 101 Lesson

+

Run the pipelines described in the 101 Lesson

Resources

-

Like the 101 lesson, this lesson unit uses the Like the 101 lesson, this lesson unit uses the oscal-import project in this repo.

Publishing your own OSCAL in these pipelines is also worth trying - the worst they can do is fail. Bring OSCAL, especially OSCAL catalogs.

diff --git a/tutorial/source/oscal-validate/oscal-validate_101_src.html b/tutorial/source/oscal-validate/oscal-validate_101_src.html index f7f8b60c..37dc669c 100644 --- a/tutorial/source/oscal-validate/oscal-validate_101_src.html +++ b/tutorial/source/oscal-validate/oscal-validate_101_src.html @@ -2,7 +2,7 @@ 101: Seeing valid OSCAL - +

101: Seeing valid OSCAL

@@ -51,7 +51,7 @@

Boldly coding

ideas.

The best of it is, as you learn how a traceback is a tasty treat, you enter a virtuous learning cycle. Repair a few bugs and you might get a taste for it. (Try the 102 Lesson unit )

+ class="LessonUnit">102 Lesson unit )

If you'd rather keep your feet dry, advance to the next Lesson.

diff --git a/tutorial/source/oscal-validate/oscal-validate_102_src.html b/tutorial/source/oscal-validate/oscal-validate_102_src.html index 9ab29772..f7bf88b9 100644 --- a/tutorial/source/oscal-validate/oscal-validate_102_src.html +++ b/tutorial/source/oscal-validate/oscal-validate_102_src.html @@ -2,7 +2,7 @@ 102: Validating OSCAL - +

102: Validating OSCAL

diff --git a/tutorial/source/setup/setup_101_src.html b/tutorial/source/setup/setup_101_src.html index 2f75eff0..cf98d947 100644 --- a/tutorial/source/setup/setup_101_src.html +++ b/tutorial/source/setup/setup_101_src.html @@ -2,6 +2,7 @@ 101: Project setup and installation +

101: Project setup and installation

@@ -32,7 +33,7 @@

Prerequisites

Resources

The setup script is a bash script: ./setup.sh, to be run with no arguments.

-

For XProc runtime -- to execute pipelines -- use either of the scripts ./xp3.sh (under bash) or ./xp3.bat (for Windows). These scripts are +

For XProc runtime — to execute pipelines — use either of the scripts ./xp3.sh (under bash) or ./xp3.bat (for Windows). These scripts are used for all pipelines (basically, for everything) unless otherwise noted.

The following pipelines will be run. They are described in top-level README documentation and the expected places.

    @@ -94,12 +95,12 @@

    Comments / review

    is never like that. This project is based on the premise that a lab environment can be useful even for studying things more commonly encountered in the real world.

    Effectively (and much more could be said about the processing stack, dependency management and so forth) - what this means is that XProc offers the user and the developer (in either or both roles) very focused and - concentrated points of control or points of adjustment. Out in the field - where software is deployed and - used - it may never be like that. User interfaces constrain what users can do, and even developers are - rarely free to just mess around, as it might be thought of.

    -

    To the extent this is the case, this project only works if things are actually simple enough to pick up and - use.

    + what this means is that XProc offers the user and the developer (in either or both roles) with focused and + concentrated points of control or points of adjustment. In the field -- where software is deployed and + used -- things almost never just drop in. User interfaces, APIs, dependencies and platform quirks: all these + constrain what users can do, and even developers are rarely free to just mess around, as it might be thought of.

    +

    To the extent this is the case, this project only works if things are actually simple enough to pick up, + use, learn and adapt.

    xp3.sh and xp3.bat represent attempts at this. Each of them (on its execution platform) enables a user to run, without further configuration, the Morgana XProcIIIse processor on any XProc @@ -111,28 +112,32 @@

    Comments / review

    designated. XProc 3.0 is both scalable and flexible enough to open a wide range of possibilities for data processing, both XML-based and using other formats such as JSON and plain text. It is the intent of this project not to explore and map this space – which is vast – but to show off enough XProc and related logic - (XSLT, XSpec) to show how this exploration can be done.

    -

    As simple examples, these scripts show only one way of running XProc. Keep in mind that even simple scripts - can be used in more than one way.

    -

    For example, a pipeline can be executed from the project root:

    -
    $ ./xp3.sh smoketest/TEST-XPROC3.xpl
    -

    Alternatively, a pipeline can be executed from its home directory, for example if currently in the - smoketest directory (note the path to the script):

    -
    $ ../xp3.sh TEST-XPROC3.xpl
    -

    This works the same ways on Windows, with adjustments:

    -
    > ..\xp3 TEST-XPROC3.xpl 
    -

    (On Windows a bat file suffix marks it as executable and does not have to be given explicitly - when calling.)

    -

    Windows users (and others to varying degrees) can set up a drag-and-drop based workflow - using your mouse - or pointer, select an XProc pipeline file and drag it to a shortcut for the executable (Windows batch file). - A command window opens to show the operation of the pipeline. See the README - for more information.

    -

    It is important to try things out since any of these methods can be the basis of a workflow.

    -

    For the big picture, keep in mind that while the command line is useful for development and demonstration – - and however familiar XProc itself may become to the developer – to the uninitiated it remains obscure and - cryptic. XProc-based systems, when integrated into tools or developer editors and environments, can look - much nicer than tracebacks in a console window. The beauty we are looking for here is in a different kind of - elegance and power.

    + (XSLT, XSpec) to show how this exploration can be done. We are an outfitter at the beginning of what + we hope will be a long and profitable voyage.

    +
    +

    Tweaks

    +

    As simple examples, these scripts show only one way of running XProc. Keep in mind that even simple + scripts can be used in more than one way.

    +

    For example, a pipeline can be executed from the project root:

    +
    $ ./xp3.sh smoketest/TEST-XPROC3.xpl
    +

    Alternatively, a pipeline can be executed from its home directory, for example if currently in the + smoketest directory (note the path to the script):

    +
    $ ../xp3.sh TEST-XPROC3.xpl
    +

    This works the same ways on Windows, with adjustments:

    +
    > ..\xp3 TEST-XPROC3.xpl 
    +

    (On Windows a bat file suffix marks it as executable and does not have to be given + explicitly when calling.)

    +

    Windows users (and others to varying degrees) can set up a drag-and-drop based workflow - using your + mouse or pointer, select an XProc pipeline file and drag it to a shortcut for the executable (Windows + batch file). A command window opens to show the operation of the pipeline. See the README for more information.

    +

    It is important to try things out since any of these methods can be the basis of a workflow.

    +

    For the big picture, keep in mind that while the command line is useful for development and demonstration + – and however familiar XProc itself may become to the developer – to the uninitiated it remains obscure + and cryptic. XProc-based systems, when integrated into tools or developer editors and environments, can + look much nicer than tracebacks in a console window. The beauty we are looking for here is in a different + kind of elegance and power.

    +
\ No newline at end of file diff --git a/tutorial/source/setup/setup_102_src.html b/tutorial/source/setup/setup_102_src.html index 31496c10..b1c92640 100644 --- a/tutorial/source/setup/setup_102_src.html +++ b/tutorial/source/setup/setup_102_src.html @@ -2,7 +2,7 @@ 102: Examining the setup - +

102: Examining the setup

Goals

diff --git a/tutorial/source/setup/setup_599_src.html b/tutorial/source/setup/setup_599_src.html index 1d0cccb9..74b27cb6 100644 --- a/tutorial/source/setup/setup_599_src.html +++ b/tutorial/source/setup/setup_599_src.html @@ -2,7 +2,7 @@ 599: Meeting XProc - +

599: Meeting XProc

diff --git a/tutorial/source/unpack/unpack_101_src.html b/tutorial/source/unpack/unpack_101_src.html index 241740cd..b0c97d96 100644 --- a/tutorial/source/unpack/unpack_101_src.html +++ b/tutorial/source/unpack/unpack_101_src.html @@ -2,7 +2,7 @@ 101: Unpacking XProc 3.0 - +

101: Unpacking XProc 3.0

@@ -55,11 +55,11 @@

A closer look

  • smoketest/TEST-XPROC3.xpl amounts to an XProc Hello World. In that spirit, feel free to edit and adjust this file.
  • -
  • smoketest/SMOKETEST-XSLT.xpl tests Saxon, an +
  • smoketest/TEST-XSLT.xpl tests Saxon, an XSLT/XQuery transformation engine. XSLT and XQuery are related technologies (different languages, same data model) developed with XML processing in mind, but in recent years generalized to a wider range of data structures.
  • -
  • smoketest/SMOKETEST-SCHEMATRON.xpl tests +
  • smoketest/TEST-SCHEMATRON.xpl tests SchXSLT. SchXSLT is an implementation of Schematron, an ISO-standard validation and reporting technology. Schematron relies on XSLT, so this library requires Saxon.
  • smoketest/TEST-XSPEC.xpl tests XSpec, an diff --git a/tutorial/source/unpack/unpack_102_src.html b/tutorial/source/unpack/unpack_102_src.html index 8ee0a270..3efec76c 100644 --- a/tutorial/source/unpack/unpack_102_src.html +++ b/tutorial/source/unpack/unpack_102_src.html @@ -2,7 +2,7 @@ 102: XProc fundamentals - +

    102: XProc fundamentals

    @@ -23,13 +23,12 @@

    102: XProc fundamentals

    Prerequisites

    You have done Setup 101, Setup 102 and Unpack 101.

    + class="LessonUnit">Setup 102 and Unpack 101.

    Learning about XProc

      -
    • Search engines: use keywords XProc3 or XProc 3.0 to help distinguish from 1.0 - technologies
    • +
    • Search engines: use keywords XProc3 or XProc 3.0 to help distinguish from 1.0 technologies
    • Resources: links here and elsewhere
    • Hands on exercises
    • Work the notes - save out and annotate these pages
    • @@ -62,7 +61,7 @@

      XProc files and XProc steps

      architecture: the pipeline comprises a step, with its own library not imported but in line. This can be useful.

      An example of a step library in this repository is xpec-execute.xpl, which collects several steps supporting XSpec, one each for supporting the + >xspec-execute.xpl, which collects several steps supporting XSpec, one each for supporting the XSpec testing framework for XSLT, XQuery and Schematron respectively.

      The advantage of defining a step at the top level, rather than putting all steps into libraries, is that such a step can be invoked without prior knowledge of its type name, which is used by XProc to @@ -115,15 +114,15 @@

      XProc embedded documentation

      XProc step prologue and body

      Keep in mind that every XProc pipeline is also, potentially and actually, a step. There are two things we need to know about steps - how to define them, and how to use them.

      -

      We begin with how to recognize and use steps, but we can't avoid how to define them: because an XProc - pipeline is also an XProc step, we can't use steps without ending up with a pipeline. We have only to - look at the working pipeline we make with our steps, to see how a step is made.

      +

      We begin with how to recognize and use steps. But because an XProc pipeline is also an XProc step, we + can't use steps without ending up with a pipeline. We have only to look at the working pipeline we make + with our steps, to see how a step is made.

      As described in the XProc 3.0 specification, XProc step declarations can be divided into an initial set of elements for setup - and configuration, followed by what the specification calls a subpipeline, which is typically a + and configuration, followed by what the specification calls a subpipeline, consisting of a sequence of steps to be executed – any steps available, which could be anything. Think of the subpipeline as the working parts of the pipeline, while the rest is all about how it is set up.

      -

      The list of elements that come before the steps is short, which helps: p:import, +

      The list of elements that come before the subpipeline is short, which helps: p:import, p:import-functions, p:input, p:output, p:option or p:declare-step. Everything coming after is a step.

      Within this set of elements (all preceding, none following the subpipeline) XProc further distinguishes @@ -138,10 +137,9 @@

      XProc step prologue and body

      Following the prologue, a step may also have local step definitions (p:declare-step).

      After imports, prologue and (optional) step declarations, the step sequence that follows comprises the subpipeline.

      -

      One other complication: for purposes of exposition, we have pretended that p:variable (a - variable declaration) and p:documentation (for out-of-band documentation) are steps, which - is not how the XProc recommendation describes them, although they appears in the subpipeline with and - among its steps.

      +

      One other complication: among the steps in the subpipeline, p:variable (a variable + declaration) and p:documentation (for out-of-band documentation) are also permitted – these + are not properly steps, but can be useful to have with them.

      In summary: any XProc pipeline, viewed as a step declaration, can have the following --

      • Pipeline name and type assignment (if needed), given as attributes at the top
      • @@ -151,8 +149,8 @@

        XProc step prologue and body

      • If no ports are named, assume a single source primary input port, permitting a single document
      -
    • Optionally (and not common): step declarations for local steps - each has its own name and type, - prologue and steps
    • +
    • Optionally (and not common): step declarations for local steps, appearing at + p:declare-step. Each of these will have its own name, type, prologue and steps
    • For this pipeline, one or more steps, called the subpipeline
      • Standard atomic and compound steps in XProc namespace (probably prefixed p:)
      • @@ -170,7 +168,7 @@

        Atomic and compound steps

        Given an understanding of the organization of an XProc pipeline, all that remains to understand of its syntax is the steps themselves, which follow a common pattern. Briefly put, atomic steps are any steps you use by simply invoking it with inputs and options: its logic is self-contained, and the operation it - carries out is (at least conceptually) single. Compound steps, instead, are used to execute more + carries out is (at least conceptually) single. Compound steps, instead, are used to deploy more than one subpipeline, with settings determined dynamically for the step.

        Fortunately XProc keeps things simple by providing only a few compound steps supporting the identified range of needs – and no way for users to define their own. This does not prove to be a practical @@ -228,7 +226,7 @@

        Namespaces and extension steps

    Schema for XProc 3.0

    -

    See the 599-level coverage in this lesson unit for a discussion of the +

    See the 599-level coverage in this lesson unit for a discussion of the schema for XProc.

diff --git a/tutorial/source/unpack/unpack_599_src.html b/tutorial/source/unpack/unpack_599_src.html index 66f2ce99..26fc3c1e 100644 --- a/tutorial/source/unpack/unpack_599_src.html +++ b/tutorial/source/unpack/unpack_599_src.html @@ -2,7 +2,7 @@ 599: More context - +

599: More context

More in depth.

@@ -35,7 +35,7 @@

XProc schema

>XProc Specification. This RNG schema is very useful.

It may often be considered gratuitous to validate XProc files against a schema, when the application (for - us, Morgana)must in any case take responsibility for conformance issues, as it sees fit. The reference + us, Morgana) must in any case take responsibility for conformance issues, as it sees fit. The reference schema becomes useful if we find or suspect bugs in Morgana, but until then it need not have any direct role in any runtime operation.

Nevertheless the RNG schema still serves as a reference and an object for querying -- queries whose results @@ -47,14 +47,14 @@

XPath

Like other XDM-based technologies, XProc embeds and incorporates XPath, an expression language for XML. XPath 3.0 is a functional language in its own right, although not designed for end-to-end processing of encoded source data into encoded results, but only for certain critical operations that ordinarily need to - be performed within such end-to-end processing. Since it is partial in this way, XPath is defined not in - terms of any data notation (such as XML syntax or any other) but rather against an abstract data - object, namely an XDM instance (XML data model), - a putative information object that may be provided to the system by parsing an XML (syntax) instance, or by - other means. As the query language for XDM and the - basis for XQuery, XPath is the other half of the data - model, which any architect of a system using this technology must know. Learning XPath equips you mentally - for dealing with the XDM in XQuery, XSLT, XProc or anywhere you find it.

+ be performed within such end-to-end processing. Importantly, XPath is defined not in terms of any data + notation (such as XML syntax or any other) but rather against an abstract data object, namely an XDM instance (XML data model), a putative information + object that may be provided to the system by parsing an XML (syntax) instance, or by other means. As the + query language for XDM and the basis for XQuery, XPath is the other half of the data model, which any + architect of a system using this technology must know. Learning XPath equips you mentally for dealing with + the XDM in XQuery, XSLT, XProc or anywhere you find it.

For those not already familiar with XPath, on line resources can be helpful. Keep in mind that XPath 3.1 outstrips XPath 1.0 in many important respects.

@@ -64,8 +64,8 @@

Documents and data

for the representation and transmission of structured data. A specialized class of data formats has evolved that represent information in ways that are not unstructured, but that contrast with more common or usual structures of data formats, whether they be tabular data, serialization formats for - object models, or some other regular and fore-ordained arrangement. One might say common or - usual with reservation, since of course documents are not uncommon where they are common.

+ object models, or some other regular (formalized and codified) arrangement. One might say common + or usual with reservation, since of course documents are not uncommon where they are common.

We see a great deal of structured data these days if only because it is so easy to make structured data with machines, and we now have the machines. What remains difficult is to translate what has not been created by a machine, into a form that a machine can recognize, or rather into a form we can @@ -94,6 +94,9 @@

Survey of XProc elements

All elements defined by XProc are listed in this analytical breakout.

TODO - tbd - reformat this table for legibility (CSS grids); validate its completeness against XProc RNG?

+

NB - XProc 3.1 makes this a moving target.

+

NB also – see Erik Siegel's XProcRef indexing project for more + detailed summaries.

@@ -199,7 +202,8 @@

XML time line

- + @@ -227,7 +231,7 @@

XML time line

- + @@ -408,25 +412,25 @@

XPath illustrative examples

Function
1987 SGML (ISO-IEC 8879-1)parsing logic; schema validation; configurable syntax; tree of elements and attributesparsing logic; schema validation; configurable syntax; (implicit) tree of elements and + attributes Proprietary stacks Mainframes, workstations
2000 XML-configured software builds Apache Ant Java
-

XML and XDM: context and rationale

+

XML and the XDM: context and rationale

  • Standard, non-proprietary and freely available without restriction
  • Consistently and repeatedly shown to be capable at scale (size/complexity)
  • -
  • Supported by commodity tools, easing problem of proprietary product endorsement
  • +
  • Supported by commodity tools, easing problem of proprietary product dependencies
-

The technologies we rely on share a common foundation in XML and XDM, technologies developed under the - auspices of the World Wide Web Consortium.

-

They are commodity tools in the sense that they are freely available to use without restriction, an - important qualification for this distribution, which has a prior commitment not to endorse particular - technological solutions to any problem, however posed or circumscribed. Accordingly, solutions here - are not offered as recommendations, but rather as stipulations of (minimum) viable functionality in tools or - capabilities, and not only using tools as black boxes, but under control and conformant to external - specifications – i.e., standards.

+

The technologies we rely on share a common foundation in XML and XDM (the XML data model), technologies + developed under the auspices of the World Wide Web Consortium.

+

These are supported by commodity tools that are freely available to use without restriction, an important + qualification for this distribution, which has a prior commitment not to endorse particular technological + solutions to any problem, however posed or circumscribed. Accordingly, solutions here are not offered + as recommendations, but rather as stipulations of (minimum) viable functionality in tools or capabilities, + and not only using tools as black boxes, but under control and conformant to external specifications + – i.e., standards.

Users of these tools should keep in mind the model whereby we imagine the viability of a tools market and - ecosystem that enables both large and small software developers including independent developers, academic - researchers, and students, to participate meaningfully, finding an appropriate value or service proposition - to provide their long-term goals. Translated, this means the tools must be capable enough for industrial use - at scale, while also scale down to demonstration or classroom use.

+ ecosystem that enables both large and small software developers – including independent developers, academic + researchers, and students – to participate meaningfully, finding an appropriate value or service proposition + to support immediate and long-term goals. Translated, this means the tools must be capable enough for + industrial use at scale, while they must also scale down to demonstration or classroom use.

In web standards including HTML and Javascript (ECMAScript) we arguably have the beginnings of such an ecosystem, while it is also contested and turbulent. Within the publishing sector more broadly and intersecting with the web, the XML family of standards arguably provides the best demonstration of complete diff --git a/tutorial/src/lesson-html.sch b/tutorial/src/lesson-html.sch index ad290d82..94121e7b 100644 --- a/tutorial/src/lesson-html.sch +++ b/tutorial/src/lesson-html.sch @@ -6,11 +6,12 @@ - + Element is not expected in this HTML profile. @@ -49,7 +50,7 @@ - Internal link is misdirected + Internal link is misdirected - href does not match element content Link to lesson should be given @class='LessonUnit' diff --git a/tutorial/src/testing/readme.md b/tutorial/src/testing/readme.md new file mode 100644 index 00000000..4788b947 --- /dev/null +++ b/tutorial/src/testing/readme.md @@ -0,0 +1,10 @@ +# Tutorial production testing + +Tutorial testing is mostly conducted by running the generation pipelines and checking results - not under automation. + +This folder contains unit testing for some processes selected for their suitability as well as potential for reuse - the first of these is HTML -> Markdown conversion. + +The XSpec test suite [xhtml-to-md.xspec](xhtml-to-md.xspec) does not yet test the Markdown conversion exhaustively. But its basic testing is enough to provide protection against breaking silently, while it is also extensible and useful for supporting ongoing development. + +Note this XSpec *must pass* for the branch to be pulled into the repository, or removed from the list of XSpec files to be run under CI/CD at [../../../testing/FILESET_XSPEC.xpl](../../../testing/FILESET_XSPEC.xpl) + diff --git a/tutorial/src/xhtml-to-markdown.xsl b/tutorial/src/xhtml-to-markdown.xsl index e4c64ef6..f81c6356 100644 --- a/tutorial/src/xhtml-to-markdown.xsl +++ b/tutorial/src/xhtml-to-markdown.xsl @@ -54,11 +54,9 @@ - - + - + diff --git a/tutorial/tutorial-preview.html b/tutorial/tutorial-preview.html index ca66f94d..efb00e5a 100644 --- a/tutorial/tutorial-preview.html +++ b/tutorial/tutorial-preview.html @@ -43,6 +43,9 @@

Step Two: Confirm

Comments / review

+
+

Tweaks

+
@@ -179,7 +182,7 @@

XML time line

XPath illustrative examples

-

XML and XDM: context and rationale

+

XML and the XDM: context and rationale

Exercise: Discussion board

@@ -198,8 +201,14 @@

Prerequisites

Resources

+
+

Step zero: an identity pipeline

+

Step one: convert some OSCAL XML into OSCAL JSON

+
+

The playing field is the internet

+

Step two: return trip

@@ -372,7 +381,7 @@

Step two: edit and adjust

-

102: Publishing OSCAL

+

102: More OSCAL Publishing

Goals

@@ -406,7 +415,10 @@

Resources

Step one: acquire resources

-

Step two (to skip): produce HTML

+

Step two: examine HTML source data

+
+

Warning: fragile!

+

Step three: run the pipeline

@@ -483,14 +495,14 @@

Prerequisites

bash, the setup can be done by hand (downloading and unpacking a package from SourceForge).

After installation, subsequent work on Windows does not require bash unless you choose to use - it – a Windows CMD or Powershell can serve as your environment and the processor invoked with a - Windows bat file (as described in the documentation). Mac and LInux (and WSL) users can + it – a Windows CMD or Powershell can serve as your environment and the processor invoked with a + Windows bat file (as described in the documentation). Mac and Linux (and WSL) users can continue to use bash.

Resources

The setup script is a bash script: ./setup.sh, to be run with no arguments.

-

For XProc runtime -- to execute pipelines -- use either of the scripts ./xp3.sh (under bash) or ./xp3.bat (for Windows). These scripts are +

For XProc runtime — to execute pipelines — use either of the scripts ./xp3.sh (under bash) or ./xp3.bat (for Windows). These scripts are used for all pipelines (basically, for everything) unless otherwise noted.

The following pipelines will be run. They are described in top-level README documentation and the expected places.

Step One: Setup

-

Find setup instructions for the repository in the Project README and in the linked Setup Notes.

+

Find setup instructions for the repository in the Project README and in the linked Setup Notes.

After reading and reviewing these documents, perform the setup as instructed. To do this you can either - fork or clone the repository in Github or simply download and decompress a zip of the current + fork or clone the repository in GitHub or simply download and decompress a zip of the current distribution.

After running the setup script, or performing the installation by hand, make sure you can run all the smoke tests successfully.

@@ -534,11 +546,11 @@

Shortcut

If you want to run through the tutorial exercises but you are unsure of how deeply you will delve, you can postpone two of the installations until later:

    -
  • You will need SchXSLT only when you want to run Schematron
  • -
  • You will need XSpec only when you want to run XSpec unit tests
  • +
  • You will need XSpec only when you want to run tests of stylesheets or queries using the XSpec testing framework
  • +
  • You will need SchXSLT only when you want to run Schematron (or XSpec tests of Schematron)

When you see tracebacks suggesting one of these is not supported, you can return to setup.

-

Since almost any pipeline will use XSLT and since we do use the latest version (XSLT 3.0/3.1), consider +

Since almost any pipeline will use XSLT and since we do use the latest version (XSLT 3.0 with XPath 3.1), consider the Saxon installation an essential requirement.

@@ -564,12 +576,12 @@

Comments / review

is never like that. This project is based on the premise that a lab environment can be useful even for studying things more commonly encountered in the real world.

Effectively (and much more could be said about the processing stack, dependency management and so forth) - what this means is that XProc offers the user and the developer (in either or both roles) very focused and - concentrated points of control or points of adjustment. Out in the field - where software is deployed and - used - it may never be like that. User interfaces constrain what users can do, and even developers are - rarely free to just mess around, as it might be thought of.

-

To the extent this is the case, this project only works if things are actually simple enough to pick up and - use.

+ what this means is that XProc offers the user and the developer (in either or both roles) with focused and + concentrated points of control or points of adjustment. In the field -- where software is deployed and + used -- things almost never just drop in. User interfaces, APIs, dependencies and platform quirks: all these + constrain what users can do, and even developers are rarely free to just mess around, as it might be thought of.

+

To the extent this is the case, this project only works if things are actually simple enough to pick up, + use, learn and adapt.

xp3.sh and xp3.bat represent attempts at this. Each of them (on its execution platform) enables a user to run, without further configuration, the Morgana XProcIIIse processor on any XProc @@ -580,54 +592,60 @@

Comments / review

pipeline, and stands back. The logic of operations is entirely encapsulated in the XProc pipeline designated. XProc 3.0 is both scalable and flexible enough to open a wide range of possibilities for data processing, both XML-based and using other formats such as JSON and plain text. It is the intent of this - project not to explore and map this space – which is vast – but to show off enough XProc and related logic - (XSLT, XSpec) to show how this exploration can be done.

-

As simple examples, these scripts show only one way of running XProc. Keep in mind that even simple scripts - can be used in more than one way.

-

For example, a pipeline can be executed from the project root:

-
$ ./xp3.sh smoketest/TEST-XPROC3.xpl
-

Alternatively, a pipeline can be executed from its home directory, for example if currently in the - smoketest directory (note the path to the script):

-
$ ../xp3.sh TEST-XPROC3.xpl
-

This works the same ways on Windows, with adjustments:

-
> ..\xp3 TEST-XPROC3.xpl 
-

(On Windows a bat file suffix marks it as executable and does not have to be given explicitly - when calling.)

-

Windows users (and others to varying degrees) can set up a drag-and-drop based workflow - using your mouse - or pointer, select an XProc pipeline file and drag it to a shortcut for the executable (Windows batch file). - A command window opens to show the operation of the pipeline. See the README - for more information.

-

It is important to try things out since any of these methods can be the basis of a workflow.

-

For the big picture, keep in mind that while the command line is useful for development and demonstration – - and however familiar XProc itself may become to the developer – to the uninitiated it remains obscure and - cryptic. XProc-based systems, when integrated into tools or developer editors and environments, can look - much nicer than tracebacks in a console window. The beauty we are looking for here is in a different kind of - elegance and power.

+ project not to explore and map this space – which is vast – but to show off enough XProc and related logic + (XSLT, XSpec) to show how this exploration can be done. We are an outfitter at the beginning of what + we hope will be a long and profitable voyage.

+
+

Tweaks

+

As simple examples, these scripts show only one way of running XProc. Keep in mind that even simple + scripts can be used in more than one way.

+

For example, a pipeline can be executed from the project root:

+
$ ./xp3.sh smoketest/TEST-XPROC3.xpl
+

Alternatively, a pipeline can be executed from its home directory, for example if currently in the + smoketest directory (note the path to the script):

+
$ ../xp3.sh TEST-XPROC3.xpl
+

This works the same ways on Windows, with adjustments:

+
> ..\xp3 TEST-XPROC3.xpl 
+

(On Windows a bat file suffix marks it as executable and does not have to be given + explicitly when calling.)

+

Windows users (and others to varying degrees) can set up a drag-and-drop based workflow - using your + mouse or pointer, select an XProc pipeline file and drag it to a shortcut for the executable (Windows + batch file). A command window opens to show the operation of the pipeline. See the README for more information.

+

It is important to try things out since any of these methods can be the basis of a workflow.

+

For the big picture, keep in mind that while the command line is useful for development and demonstration + – and however familiar XProc itself may become to the developer – to the uninitiated it remains obscure + and cryptic. XProc-based systems, when integrated into tools or developer editors and environments, can + look much nicer than tracebacks in a console window. The beauty we are looking for here is in a different + kind of elegance and power.

+

102: Examining the setup

-

-

Goals

  • Look at some pipeline organization and syntax on the inside
  • -
  • Success and failure invoking XProc pipelines: an early chance to “learn to dieâ€� gracefully (to use the +
  • Success and failure invoking XProc pipelines: an early chance to "learn to die" gracefully (to use the gamers' idiom).

Resources

-

Same as Setup 101.

+

Same as Setup 101.

Prerequisites

-

Please complete the repository setup and smoke tests as described in the 101 lesson. In this lesson, we will run these pipelines with adjustments, or similar pipelines.

-

This discussion assumes basic knowledge of coding, the Internet (including retrieving resources via file and http protocols, and web-based technologies including HTML.

-

XML knowledge is also assumed, while at the same time we are interested to know where this gap needs to be - filled.

+

Please complete the repository setup and smoke tests as described in the 101 lesson. In this lesson, we will run these pipelines with adjustments, or + similar pipelines.

+

This discussion assumes basic knowledge of coding, the Internet (including retrieving resources via + file and http protocols), and web-based technologies including HTML.

+

XML knowledge is also assumed. In particular, XProc uses XPath + 3.1, the query language for XML. This latest version of XPath builds on XPath 1.0, so any XPath + experience will help. In general, any XSLT or XQuery experience will be invaluable.

You will also need a programmer's plain text editor, XML/XSLT editor or IDE (integrated development environment) for more interactive testing of the code.

@@ -636,7 +654,7 @@

Step One: Inspect the pipelines

The two groupings of pipelines used in setup and testing can be considered separately.

The key to understanding both groups is to know that once the initial Setup script is run, Morgana can be invoked directly, as paths and scripts are already in place. In doing - so – before extension libraries are in place – it can use only basic XProc steps, but those are enough for + so – before extension libraries are in place – it can use only basic XProc steps, but those are enough for these purposes.

Specifically, the pipelines can acquire resources from the Internet, save them locally, and perform unarchiving (unzipping). Having been downloaded, each library provides software that the pipeline engine @@ -659,15 +677,15 @@

Step One: Inspect the pipelines

  • smoketest/TEST-XPROC3.xpl tests MorganaXProc-III
  • - smoketest/SMOKETEST-XSLT.xpl tests Saxon
  • + smoketest/TEST-XSLT.xpl tests Saxon
  • - smoketest/SMOKETEST-SCHEMATRON.xpl tests + smoketest/TEST-SCHEMATRON.xpl tests SchXSLT
  • smoketest/TEST-XSPEC.xpl tests XSpec
  • -

    Take a look at these. If it is helpful, try visualize the XML syntax as a set of nested frames with labels - and connectors.

    +

    Take a look at these. If it is helpful, try to see the XML syntax as a set of nested frames with labels and + connectors.

    Try more than one way of looking at the XProc source code: in the Github repository, on your file system, in a plain text editor, in an XML editor.

    @@ -675,8 +693,8 @@

    Step One: Inspect the pipelines

    Step Two: Modify the pipelines

    Use a text editor or IDE for this exercise.

    If you have any concepts for improvements to the pipelines, or other resources that might be acquired this way, copy and modify one of the pipelines given to achieve those results.

    -

    Even if not - be sure to break the pipelines given -- or of copies under new names -- in any of several - ways. Then run the modified pipelines, as a safe way to familiarize yourself with error messages:

    +

    Even if not - be sure to break the pipelines given -- or copies under new names -- in any of several ways. + Then run the modified pipelines, as a safe way to familiarize yourself with error messages:

    • Break the XML syntax of a pipeline and try to run it
    • Leave XML syntax intact (well-formed), but break something in the XProc
        @@ -699,7 +717,7 @@

        For consideration

        so they can be deployed, used, refitted and maintained not just for repetitive generic tasks, but for particular, special and local problems discovered only at the points where information is gathered and codified.

        -

        This larger fitting of solutions to problems is a responsibility for both CMEs (content matter experts) and +

        This larger fitting of solutions to problems is a responsibility for both SMEs (subject matter experts) and developers together, who must define problems to be solved before approaches to them can be found.

        The open questions are: who can use XProc pipelines; and how can they be made more useful? The questions come up in an OSCAL context or any context where XML is demonstrably capable.

        @@ -710,8 +728,8 @@

        For consideration

        599: Meeting XProc

        Some observations

        -

        Because it is now centered on pipelines as much as on software packages, dependency management is - different from other technologies including Java and NodeJS - how so?

        +

        Because it is now centered on pipelines as much as on files and software packages, dependency + management is different from other technologies including Java and NodeJS - how so?

        MorganaXProc-III is implemented in Scala, and Saxon is built in Java, but otherwise distributions including the SchXSLT and XSpec distributions consist mainly of XSLT. This is either very good (with development and maintenance requirements in view), or not good at all.

        @@ -783,12 +801,12 @@

        A closer look

        smoketest/TEST-XPROC3.xpl amounts to an XProc Hello World. In that spirit, feel free to edit and adjust this file.
      • - smoketest/SMOKETEST-XSLT.xpl tests Saxon, an + smoketest/TEST-XSLT.xpl tests Saxon, an XSLT/XQuery transformation engine. XSLT and XQuery are related technologies (different languages, same data model) developed with XML processing in mind, but in recent years generalized to a wider range of data structures.
      • - smoketest/SMOKETEST-SCHEMATRON.xpl tests + smoketest/TEST-SCHEMATRON.xpl tests SchXSLT. SchXSLT is an implementation of Schematron, an ISO-standard validation and reporting technology. Schematron relies on XSLT, so this library requires Saxon.
      • @@ -877,13 +895,13 @@

        Resources

        Prerequisites

        You have done Setup 101, Setup 102 and Unpack 101.

        + class="LessonUnit">Setup 102 and Unpack 101.

      • Learning about XProc

          -
        • Search engines: use keywords XProc3 or XProc 3.0 to help distinguish from 1.0 - technologies
        • +
        • Search engines: use keywords XProc3 or XProc 3.0 to help distinguish from 1.0 technologies
        • Resources: links here and elsewhere
        • Hands on exercises
        • Work the notes - save out and annotate these pages
        • @@ -915,7 +933,7 @@

          XProc files and XProc steps

          Additionally, step declarations can include their own pipeline (step) declarations, making a hybrid architecture: the pipeline comprises a step, with its own library not imported but in line. This can be useful.

          -

          An example of a step library in this repository is xpec-execute.xpl, which collects several steps supporting XSpec, one each for supporting the +

          An example of a step library in this repository is xspec-execute.xpl, which collects several steps supporting XSpec, one each for supporting the XSpec testing framework for XSLT, XQuery and Schematron respectively.

          The advantage of defining a step at the top level, rather than putting all steps into libraries, is that such a step can be invoked without prior knowledge of its type name, which is used by XProc to @@ -954,8 +972,8 @@

          XProc as an XML document

          XProc embedded documentation

          An example of this is the XProc p:documentation element. This element is designed to carry documentation to a consuming application. Rather than mandate some kind of behavior for - p:documentation – something difficult or impossible to do for the general case, or to - test –- the XProc rule is anything marked as documentation is for some other consumer, i.e. a + p:documentation – something difficult or impossible to do for the general case, or to + test –- the XProc rule is anything marked as documentation is for some other consumer, i.e. a documentation engine, not the XProc processor. In other words, a conformant processor must ignore anything it sees inside p:documentation.

          @@ -968,31 +986,30 @@

          XProc embedded documentation

          XProc step prologue and body

          Keep in mind that every XProc pipeline is also, potentially and actually, a step. There are two things we need to know about steps - how to define them, and how to use them.

          -

          We begin with how to recognize and use steps, but we can't avoid how to define them: because an XProc - pipeline is also an XProc step, we can't use steps without ending up with a pipeline. We have only to - look at the working pipeline we make with our steps, to see how a step is made.

          +

          We begin with how to recognize and use steps. But because an XProc pipeline is also an XProc step, we + can't use steps without ending up with a pipeline. We have only to look at the working pipeline we make + with our steps, to see how a step is made.

          As described in the XProc 3.0 specification, XProc step declarations can be divided into an initial set of elements for setup - and configuration, followed by what the specification calls a subpipeline, which is typically a - sequence of steps to be executed – any steps available, which could be anything. Think of the subpipeline + and configuration, followed by what the specification calls a subpipeline, consisting of a + sequence of steps to be executed – any steps available, which could be anything. Think of the subpipeline as the working parts of the pipeline, while the rest is all about how it is set up.

          -

          The list of elements that come before the steps is short, which helps: p:import, +

          The list of elements that come before the subpipeline is short, which helps: p:import, p:import-functions, p:input, p:output, p:option or p:declare-step. Everything coming after is a step.

          Within this set of elements (all preceding, none following the subpipeline) XProc further distinguishes between the imports for steps and functions, appearing first (elements p:import and p:import-functions), to be followed by elements configuring the step: - p:input, p:output, p:option – elements together called the prologue.

          + p:input, p:output, p:option – elements together called the prologue.

          The prologue is used to define ports and options for the pipeline - the points of control for its interfaces. (Technically: runtime bindings, and parameter or option settings.) If only a single input is needed, a single input port (named source) can be assumed, so prologues can be empty (and invisible, or not there).

          Following the prologue, a step may also have local step definitions (p:declare-step).

          After imports, prologue and (optional) step declarations, the step sequence that follows comprises the subpipeline.

          -

          One other complication: for purposes of exposition, we have pretended that p:variable (a - variable declaration) and p:documentation (for out-of-band documentation) are steps, which - is not how the XProc recommendation describes them, although they appears in the subpipeline with and - among its steps.

          +

          One other complication: among the steps in the subpipeline, p:variable (a variable + declaration) and p:documentation (for out-of-band documentation) are also permitted – these + are not properly steps, but can be useful to have with them.

          In summary: any XProc pipeline, viewed as a step declaration, can have the following --

          • Pipeline name and type assignment (if needed), given as attributes at the top
          • @@ -1004,8 +1021,8 @@

            XProc step prologue and body

            single document
          -
        • Optionally (and not common): step declarations for local steps - each has its own name and type, - prologue and steps
        • +
        • Optionally (and not common): step declarations for local steps, appearing at + p:declare-step. Each of these will have its own name, type, prologue and steps
        • For this pipeline, one or more steps, called the subpipeline
          • Standard atomic and compound steps in XProc namespace (probably prefixed p:)
          • @@ -1025,10 +1042,10 @@

            Atomic and compound steps

            Given an understanding of the organization of an XProc pipeline, all that remains to understand of its syntax is the steps themselves, which follow a common pattern. Briefly put, atomic steps are any steps you use by simply invoking it with inputs and options: its logic is self-contained, and the operation it - carries out is (at least conceptually) single. Compound steps, instead, are used to execute more + carries out is (at least conceptually) single. Compound steps, instead, are used to deploy more than one subpipeline, with settings determined dynamically for the step.

            Fortunately XProc keeps things simple by providing only a few compound steps supporting the identified - range of needs – and no way for users to define their own. This does not prove to be a practical + range of needs – and no way for users to define their own. This does not prove to be a practical limitation, since atomic steps can have multiple inputs and outputs, distinguished by type and role, and indeed since atomic steps used in a pipeline can be defined with compound steps in their own subpipelines, either externally or even within the same step declaration.

            @@ -1102,7 +1119,8 @@

            Namespaces and extension steps

        Schema for XProc 3.0

        -

        See the 599-level coverage in this lesson unit for a discussion of the +

        See the 599-level coverage in this lesson unit for a discussion of the schema for XProc.

        @@ -1142,7 +1160,7 @@

        Syntax tips

        Exercise: Knowing what to look for

        The last lesson unit already provided an opportunity to alter pipelines and see how they fail when not - encoded correctly – when broken, any way we can think of breaking them. (Then we had an opportunity + encoded correctly – when broken, any way we can think of breaking them. (Then we had an opportunity to put them back.)

        After reading this page, do this again, except focusing on a few key areas:

          @@ -1219,7 +1237,7 @@

          XProc schema

          community-defined steps, is referenced from the XProc Specification. This RNG schema is very useful.

          It may often be considered gratuitous to validate XProc files against a schema, when the application (for - us, Morgana)must in any case take responsibility for conformance issues, as it sees fit. The reference + us, Morgana) must in any case take responsibility for conformance issues, as it sees fit. The reference schema becomes useful if we find or suspect bugs in Morgana, but until then it need not have any direct role in any runtime operation.

          Nevertheless the RNG schema still serves as a reference and an object for querying -- queries whose results @@ -1231,14 +1249,12 @@

          XPath

          Like other XDM-based technologies, XProc embeds and incorporates XPath, an expression language for XML. XPath 3.0 is a functional language in its own right, although not designed for end-to-end processing of encoded source data into encoded results, but only for certain critical operations that ordinarily need to - be performed within such end-to-end processing. Since it is partial in this way, XPath is defined not in - terms of any data notation (such as XML syntax or any other) but rather against an abstract data - object, namely an XDM instance (XML data model), - a putative information object that may be provided to the system by parsing an XML (syntax) instance, or by - other means. As the query language for XDM and the - basis for XQuery, XPath is the other half of the data - model, which any architect of a system using this technology must know. Learning XPath equips you mentally - for dealing with the XDM in XQuery, XSLT, XProc or anywhere you find it.

          + be performed within such end-to-end processing. Importantly, XPath is defined not in terms of any data + notation (such as XML syntax or any other) but rather against an abstract data object, namely an XDM instance (XML data model), a putative information + object that may be provided to the system by parsing an XML (syntax) instance, or by other means. As the + query language for XDM and the basis for XQuery, XPath is the other half of the data model, which any + architect of a system using this technology must know. Learning XPath equips you mentally for dealing with + the XDM in XQuery, XSLT, XProc or anywhere you find it.

          For those not already familiar with XPath, on line resources can be helpful. Keep in mind that XPath 3.1 outstrips XPath 1.0 in many important respects.

          Documents and data

          @@ -1246,8 +1262,8 @@

          Documents and data

          for the representation and transmission of structured data. A specialized class of data formats has evolved that represent information in ways that are not unstructured, but that contrast with more common or usual structures of data formats, whether they be tabular data, serialization formats for - object models, or some other regular and fore-ordained arrangement. One might say common or - usual with reservation, since of course documents are not uncommon where they are common.

          + object models, or some other regular (formalized and codified) arrangement. One might say common + or usual with reservation, since of course documents are not uncommon where they are common.

          We see a great deal of structured data these days if only because it is so easy to make structured data with machines, and we now have the machines. What remains difficult is to translate what has not been created by a machine, into a form that a machine can recognize, or rather into a form we can @@ -1259,7 +1275,7 @@

          Documents and data

          of supporting each document's own distinctive structure and organization, whether that be due to its family (what is called a document type) or an expression of its own intrinsic logic. The format must be not only structured, but structurable, and its structures must to some extent be capable - of self-description – combining data with metadata.

          + of self-description – combining data with metadata.

          And this is to give no consideration to the fact that these structures can be described at multiple levels of generality or specificity with regard to either their supposed semantics, or their configuration in operation.

          @@ -1268,7 +1284,7 @@

          Documents and data

          (an XDM document tree), which in turn is designed for handling the combination of highly regular and quite irregular data structures that characterize information sets we (loosely) call documentary.

          -

          A definition for what is a document is out of scope for this tutorial – an interesting topic but not only a +

          A definition for what is a document is out of scope for this tutorial – an interesting topic but not only a technical one.

        @@ -1277,6 +1293,9 @@

        Survey of XProc elements

        All elements defined by XProc are listed in this analytical breakout.

        TODO - tbd - reformat this table for legibility (CSS grids); validate its completeness against XProc RNG?

        +

        NB - XProc 3.1 makes this a moving target.

        +

        NB also – see Erik Siegel's XProcRef indexing project for more + detailed summaries.

        @@ -1413,7 +1432,8 @@

        XML time line

        - + @@ -1445,8 +1465,7 @@

        XML time line

        - + @@ -1705,25 +1724,25 @@

        XPath illustrative examples

        1987 SGML (ISO-IEC 8879-1)parsing logic; schema validation; configurable syntax; tree of elements and attributesparsing logic; schema validation; configurable syntax; (implicit) tree of elements and + attributes Proprietary stacks Mainframes, workstations
        2000 - XML-configured software builds Apache Ant Java
        -

        XML and XDM: context and rationale

        +

        XML and the XDM: context and rationale

        • Standard, non-proprietary and freely available without restriction
        • Consistently and repeatedly shown to be capable at scale (size/complexity)
        • -
        • Supported by commodity tools, easing problem of proprietary product endorsement
        • +
        • Supported by commodity tools, easing problem of proprietary product dependencies
        -

        The technologies we rely on share a common foundation in XML and XDM, technologies developed under the - auspices of the World Wide Web Consortium.

        -

        They are commodity tools in the sense that they are freely available to use without restriction, an - important qualification for this distribution, which has a prior commitment not to endorse particular - technological solutions to any problem, however posed or circumscribed. Accordingly, solutions here - are not offered as recommendations, but rather as stipulations of (minimum) viable functionality in tools or - capabilities, and not only using tools as black boxes, but under control and conformant to external - specifications – i.e., standards.

        +

        The technologies we rely on share a common foundation in XML and XDM (the XML data model), technologies + developed under the auspices of the World Wide Web Consortium.

        +

        These are supported by commodity tools that are freely available to use without restriction, an important + qualification for this distribution, which has a prior commitment not to endorse particular technological + solutions to any problem, however posed or circumscribed. Accordingly, solutions here are not offered + as recommendations, but rather as stipulations of (minimum) viable functionality in tools or capabilities, + and not only using tools as black boxes, but under control and conformant to external specifications + – i.e., standards.

        Users of these tools should keep in mind the model whereby we imagine the viability of a tools market and - ecosystem that enables both large and small software developers including independent developers, academic - researchers, and students, to participate meaningfully, finding an appropriate value or service proposition - to provide their long-term goals. Translated, this means the tools must be capable enough for industrial use - at scale, while also scale down to demonstration or classroom use.

        + ecosystem that enables both large and small software developers – including independent developers, academic + researchers, and students – to participate meaningfully, finding an appropriate value or service proposition + to support immediate and long-term goals. Translated, this means the tools must be capable enough for + industrial use at scale, while they must also scale down to demonstration or classroom use.

        In web standards including HTML and Javascript (ECMAScript) we arguably have the beginnings of such an ecosystem, while it is also contested and turbulent. Within the publishing sector more broadly and intersecting with the web, the XML family of standards arguably provides the best demonstration of complete @@ -1773,24 +1792,34 @@

        Prerequisites

        Resources

        -

        This unit relies on the oscal-convert project in this - repository, with its files. Like all projects in the repo, it is designed to be self-contained and - self-explanatory to the extent practical. Use your search engine and XProc resources to learn background and - terminology.

        +

        This unit relies on the oscal-convert project in + this repository, with its files. Like all projects in the repo, it aims to be reasonably self-contained and + self-explanatory. Use your search engine and XProc resources to learn background and terminology.

        Also like other projects, there are preliminaries for acquiring resources, along with pipelines to run.

        +
        +

        Step zero: an identity pipeline

        +

        Step one: convert some OSCAL XML into OSCAL JSON

        An acquisition pipeline in the project folder collects some OSCAL onto the local system, where it can be managed, easily inspected, controlled, and edited if necessary.

        -

        But sources and results from a conversion process do not always have to work with local resources. XProc - sees the Internet itself - whatever protocols are supported by the processor (the file and - http protocols are required for conformance) work as they do on the Worldwide Web. Of - course, permissions must be in place to read and write files from and into file system locations. But when - authentication is configured or resources are openly available, using http to reach resources - or sources can be a very convenient option.

        +

        TBD / this all incoherent so far

        +
        +

        The playing field is the internet

        +

        Keep in mind that XProc in theory, and your XProc engine in practice, may read its inputs using whatever + protocols it supports, while the file and http protocols are required for + conformance, and work as they do on the Worldwide Web. Of course, permissions must be in place to read + and write files from and into file system locations. But when authentication is configured or resources + are openly available, using http to reach resources or sources can be a very convenient + option.

        +

        Keep in mind that where resources take the form of serializations of structured data such as XML or JSON, + what is read (in the sense of presented to a consuming application) may not be quite exactly the + same data serialization, since as a serialization, it is parsed into an object or representation of some + kind,

        +

        TBD - TODO - question - how many and of what sort of source data files - so far there is only the cat catalog

          @@ -1815,8 +1844,8 @@

          What is this XSLT?

          In later units we will see how using the XProc steps described, rudimentary data manipulations can be done using XProc by itself, without entailing the use of either XSLT or XQuery (another capability invoked with a different step). At the same time, while pipelines are based on the idea of passing data through a series of - processes, there are many cases where logic is sufficiently complex that it becomes essential to maintain – - and test – that logic externally from the XProc. At what point it becomes more efficient to encapsulate + processes, there are many cases where logic is sufficiently complex that it becomes essential to maintain – + and test – that logic externally from the XProc. At what point it becomes more efficient to encapsulate logic separately (whether by XSLT, XQuery or other means), depends very much on the case.

          The p:xslt pipeline step in particular is so important for real-world uses of XProc that it is introduced early, to show such black-box application. XProc also makes a fine environment for testing XSLT @@ -1852,7 +1881,8 @@

          Intercepting errors

          In the publishing demonstration project folder is an XProc that valides XML against an OSCAL schema, before formatting it. The same could be done for an XProc that converts the data into JSON - either or both before or after conversion.

          -

          Learn more about recognizing and dealing with errors in Lesson +

          Learn more about recognizing and dealing with errors in Lesson 102, or continue on to the next project, oscal-validate, for more on validation of documents and sets of documents.

        @@ -1877,7 +1907,8 @@

        Prerequisites

        Resources

        -

        Same as the 101 lesson.

        +

        Same as the 101 lesson.

        Probing error space - data conversions

        @@ -1985,13 +2016,14 @@

        Boldly coding

        will recoil. Maybe you are one of the fearless, maybe even one of the curious. Open the pipeline code in a programmer's text editor or IDE (integrated development environment) and get a sense of just how malleable it is.

        -

        XML comment syntax takes the form of angle-bracketed text with dashes (hyphens) and a bang: <!– +

        XML comment syntax takes the form of angle-bracketed text with dashes (hyphens) and a bang: <!– -->. You will see comments throughout the code examples, sometimes as inline documentation, and sometimes for entire blocks of inactive code.

        The intrepid explorer will try both tweaking, around the edges, then adapting, with new ideas.

        The best of it is, as you learn how a traceback is a tasty treat, you enter a virtuous learning - cycle. Repair a few bugs and you might get a taste for it. (Try the 102 Lesson unit )

        + cycle. Repair a few bugs and you might get a taste for it. (Try the 102 Lesson unit )

        If you'd rather keep your feet dry, advance to the next Lesson.

        @@ -2035,7 +2067,7 @@

        What could possibly go wrong?

        and therefore cannot be read, but more subltly, in data instances that can be read, but that when read, are found to fail to conform to expectations, as expressed in an applicable rules set.

        Such a rules set is called a schema and deploying a schema to impose regularity and predictability - over an open-ended body of data – including data that has not yet been created – is a primary responsibility + over an open-ended body of data – including data that has not yet been created – is a primary responsibility of an entity that seeks to define an interoperable language, supporting robust data interchange across organizational boundaries.

        @@ -2202,18 +2234,20 @@

        Step two: edit and adjust

        -

        102: Publishing OSCAL

        +

        102: More OSCAL Publishing

        Goals

        Prerequisites

        -

        Run the pipelines described in the 101 Lesson +

        Run the pipelines described in the 101 Lesson

        Resources

        -

        Like the 101 lesson, this lesson unit uses the oscal-import project in this repo.

        +

        Like the 101 lesson, this lesson unit uses the oscal-import project in this repo.

        Publishing your own OSCAL in these pipelines is also worth trying - the worst they can do is fail. Bring OSCAL, especially OSCAL catalogs.

        OSCAL JSON catalogs can be accommodated by splicing together a conversion pipeline with a publishing @@ -2267,7 +2301,8 @@

        Resources

        Step one: acquire resources

        As usual, the project contains pipelines to be used to acquire copies of resources, placing them in the - project lib directory . These may include dependencies for steps in the pipeline (read details in the 102 lesson) so it is a good idea to run them all.

        + project lib directory . These may include dependencies for steps in the pipeline (read details in the 102 lesson) so it is a good idea to run them all.

        These include a pipeline that copies the PDF original from which the HTML input (next step) was derived, using a COTS (commercial off-the-shelf) tool. Inspect and read this PDF to see what the upstream data looks like - and get a sense of what the data set looks like when the structures are painted on the @@ -2277,41 +2312,62 @@

        Step one: acquire resources

        readme.

        -

        Step two (to skip): produce HTML

        +

        Step two: examine HTML source data

        For this exercise, we have already produced HTML from the PDF source: find it cached as an input file in the project folder. Next to it is a copy with whitespace added for legibility, which may be easier to inspect.

        -

        - Do not delete, replace, rename or alter this file, as all the subsequent processing is tuned - specifically to it, its internal organization and regularities and anomalies. Another process input - even - an HTML file showing the same text - is highly unlikely to deliver acceptable results from the - pipeline. This is an important factor to keep in mind when considering the scalability of the exercise here. - It does not require less expertise than producing the original document (in some respects it requires - more).

        -

        For some data sets, however, and especially if the exercise can also be used advantageously in other ways - - that is, beyond its considerabl eimpacts on the availability and utility of the information - even a bespoke - transformation pipeline such as this can be useful. This occurs mainly when the source document is of such - high quality and consisteny instrinsically, that exposing its semantics via a rational and explicable text - encoding - a standards-based, platform- and application-independent encoding - such as OSCAL - becomes - attractive for the leverage it gives over the information. In FM 6-22 Chapter 4, we have exactly such - a document, which fits well into standards-based documentary formats such as NISO STS and, eventually, - OSCAL.

        -

        Because PDF is relatively opaque, extracting data from a PDF file with format intact is not a trivial - exercise. Even tools designed, sold and supported by the proprietors of PDF format (Adobe, Inc.) are able at - best to create outputs that appear to present the document with its organization and information - intact, if rendered on screen with an appropriate tool (in the case of HTML, a web browser). In so doing it - may meet a low baseline of functional requirement - the document is legible - while failing to meet others, - and in particular the requirements we have for clean and well-structured data fit for reuse in a broad range - of scenarios and applications, not only page production.

        -

        Indeed this HTML file makes an excellent example of the kind of rather-poor encoding produced by a - market-leading HTML export utility. Experts in data conversion might find other ways to make better encoding - from the PDF - a task out of scope for us. (As we are not trying to optimize but only to demonstrate the - methods applied.) This HTML is good enough, and that is what is often available.

        -

        The pipeline to be run in the next step starts by loading source/export/fm6_22.html - do not - rename, move or alter this file, or expect errors!

        +

        Compare this to the PDF document you have downloaded (or the document on line). Open the HTML file in a web + browser to see what it looks like in display, but also inspect its source code. You don't have to read it: + just seeing it is enough.

        +
        +

        Warning: fragile!

        +

        + Do not delete, replace, rename or alter this file, as all the subsequent processing is tuned + specifically to it, its internal organization, regularities and anomalies. Another process input - even + an HTML file showing the same text (to any definition of same) - is highly unlikely to deliver + acceptable results from the pipeline. This is an important factor to keep in mind when considering the + scalability of the operation demonstrated. Producing a clean and legible encoding for the document + does not require less expertise than producing the original; in some ways (for example with respect to + knowledge of text encoding formats) it requires more.

        +

        For some data sets, however, even a bespoke transformation pipeline such as this can be profitable, even + beyond its impacts in greater availability and utility of the information. The expense and effort may be + warranted when the source document is of such high quality and consistency instrinsically, that exposing + its native semantics via a rational and explicable text encoding - a standards-based, platform- + and application-independent encoding - such as OSCAL - becomes attractive for the specific kinds of + affordances – the leverage – it gives for processing the information. In FM 6-22 Chapter 4, we have + exactly such a document, which fits well into standards-based documentary formats such as NISO STS and, + eventually, OSCAL.

        +

        Because PDF is relatively opaque, extracting data from a PDF file with format intact is not a trivial + exercise. PDF is arguably not a data format at all, but a language used to control a device for + casting pixels and glyphs onto a page or screen. This being its purpose, no tool can do more – at least + without the benefit of an external information source – than create outputs that appear to present + the document with its organization and information intact, if rendered on screen with an appropriate tool + (such as, in the case of an HTML rendition of the page, a web browser). In so doing it may meet a low + baseline of functional requirement - the document is legible - while failing to meet others. In + particular: failing to meet requirements for clean and well-structured data fit for reuse in a broad + range of scenarios and applications, not only page production.

        +

        Indeed this HTML file makes an excellent example of the kind of rather-poor encoding produced by a + market-leading HTML export utility. Experts in data conversion might find other ways to make better + encoding from the PDF - a task out of scope for us. (As we are not trying to find the best export + utility, but on the contrary to demonstrate methods available so we do not have to do so.) This HTML is + good enough, and that is what is often available.

        +

        Step three: run the pipeline

        +

        The pipeline starts by loading source/export/fm6_22.html +

        +

        It produces output files in a temp directory. If you want to save out any of these outputs, you + can copy files out, or edit the pipeline.

        +

        Two files are created, both representing the Field Manual, each in a different format:

        +
          +
        • NISO STS (Standards Tag Suite) format describes the full text, with tables, in XML
        • +
        • OSCAL (Open Security Controls Assessment Language) factors out a richer semantic view of the data + in OSCAL format, again presenting the full text of Chapter 4, but this time with externalized control + sets, representing 25 attributes and 50 competencies as these are described in Field Manual + 6-22 and its related documents such as ADRP 6-22 (describing the US Army Leadership Requirements + Model).
        • +

        Step four (optional): run the pipeline in diagnostic mode

        @@ -2331,12 +2387,14 @@

        Goals

        Prerequisites

        -

        Run the pipelines described in the 101 Lesson +

        Run the pipelines described in the 101 Lesson

        Resources

        -

        Like the 101 lesson, this lesson unit uses the oscal-import project in this repo.

        +

        Like the 101 lesson, this lesson unit uses the oscal-import project in this repo.

        Step one: run the pipeline in diagnostic mode