Fork for XML Schema work

pull/255/head
Baxter Tidwell 2021-05-28 12:04:24 -04:00
rodzic 4028a8cb8c
commit d7b5ca65e8
14 zmienionych plików z 11 dodań i 577 usunięć

Wyświetl plik

@ -0,0 +1,3 @@
{
"CurrentProjectSetting": null
}

Wyświetl plik

@ -0,0 +1,8 @@
{
"ExpandedNodes": [
"",
"\\proposal-docs"
],
"SelectedNode": "\\proposal-docs\\recommendations",
"PreviewInSolutionExplorer": false
}

Plik binarny nie jest wyświetlany.

BIN
.vs/slnx.sqlite 100644

Plik binarny nie jest wyświetlany.

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 48 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 90 KiB

Wyświetl plik

@ -1,28 +0,0 @@
<?xml-model href="podcast-wrapper.xsd"?>
<test-wrapper xmlns="https://podcastindex.org/namespace/1.0" xmlns:podcast="https://podcastindex.org/namespace/1.0">
<podcast:episode>1</podcast:episode>
<podcast:chapters url="https://example.com/ep1_chapters.json" type="application/json"/>
<podcast:funding url="https://example.com/donate">Support the show</podcast:funding>
<podcast:images srcset="https://example.com/images/ep1/pci_avatar-massive.jpg 1500w, https://example.com/images/ep1/pci_avatar-middle.jpg 600w, https://example.com/images/ep1/pci_avatar-small.jpg 300w, https://example.com/images/ep1/pci_avatar-tiny.jpg 150w" />
<podcast:location geo="geo:30.2672,97.7431" osm="R113314">Austin, TX</podcast:location>
<podcast:location geo="12345">12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678</podcast:location>
<podcast:locked owner="podcastowner@example.com">yes</podcast:locked>
<podcast:person group="visuals" role="cover art designer" href="https://example.com/artist/beckysmith">Becky Smith</podcast:person>
<podcast:person href="https://curry.com" img="http://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
<podcast:person href="https://en.wikipedia.org/wiki/Adam_Curry" img="http://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
<podcast:person href="https://www.podchaser.com/creators/adam-curry-107ZzmWE5f" img="https://example.com/images/adamcurry.jpg">Adam Curry</podcast:person>
<podcast:person role="guest" href="https://example.com/blog/daveajones/" img="http://example.com/images/davejones.jpg">Dave Jones</podcast:person>
<podcast:person role="guest" href="https://github.com/daveajones/" img="https://example.com/images/davejones.jpg">Dave Jones</podcast:person>
<podcast:person role="guest" href="https://www.imdb.com/name/nm0427852888/" img="http://example.com/images/davejones.jpg">Dave Jones</podcast:person>
<podcast:season name="Podcasting 2.0">1</podcast:season>
<podcast:soundbite startTime="29.32" duration="34.0" />
<podcast:soundbite startTime="33.833" duration="60.0" />
<podcast:soundbite startTime="45.4" duration="56.0" />
<podcast:transcript url="https://example.com/ep1/transcript.txt" type="text/plain" />
<podcast:transcript url="https://example.com/ep2/transcript.txt" type="text/plain" />
<podcast:transcript url="https://example.com/ep3/transcript.txt" type="text/plain" />
<podcast:value type="lightning" method="keysend" suggested="0.00000005000">
<podcast:valueRecipient name="hosting company" type="node" address="036557ea56b3b86f08be31bcd2557cae8021b0e3a9413f0c0e52625c6696972e57" split="1" />
<podcast:valueRecipient name="podcaster" type="node" address="036557ea56b3b86f08be31bcd2557cae8021b0e3a9413f0c0e52625c6696972e57" split="99" />
</podcast:value>
</test-wrapper>

Wyświetl plik

@ -1,148 +0,0 @@
# XML Schema Formal Definition of Podcast Index Namespace
A schema in XML is a definition of the elements and attributes in a particular realm known as a namespace. The namespace for the Podcast Index extension is `https://podcastindex.org/namespace/1.0`.
The namespace has a formal definition, called the XML Schema (XSD), which is designed to be readable by a machine. It also has an informal definition, which is the list of elements and their function and use. This is human-readable, and helps the developer to understand the namespace elements' purpose and use. The Podcast Index informal schema is found at `https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md`. This was originally called the "document type definition", but has been renamed to avoid confusion with an older, less versatile, XML schema syntax of the same name.
#Getting Started
These instructions assume you are using Microsoft Visual Studio Code (https://code.visualstudio.com/download), a free programming editor. You'll also need the Redhat XML extension to VS Code, `redhat.vscode-xml`. This can be found from within the VS Code Marketplace or at https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml.
Then, you'll need have the formal XML Schema document (`podcast.xsd`) on your machine. This is the formal specification of the Podcast Index namespace. To get started, you should know that, when an XML document is created, it must have a root element. Since the Podcast namespace elements are designed to exist within the RSS document namespace, the Podcast namespace doesn't need, and doesn't have, a root element.
For this reason, there's another XML Schema document, `podcast-wrapper.xsd`. This is simply a wrapper schema that defines a non-canonical element called `<test-wrapper>` that acts as the root. Inside this element can appear any of the other Podcast Index namespace tags. The wrapper schema is strictly for understanding and manually authoring the tags of the Podcast Index.
To turn on validation, you'll need the `xml-model` processing instruction at the top of the document, followed by the wrapper tag that includes the namespace declaration:
```xml
<?xml-model href="podcast-wrapper.xsd"?>
<test-wrapper xmlns="https://podcastindex.org/namespace/1.0" xmlns:podcast="https://podcastindex.org/namespace/1.0">
</test-wrapper>
```
Make sure you have an end-tag for the test-wrapper element, and save your document with a `.xml` extension so the XML add-on will know what to do. If your document is not in the same directory as the two XSD files, you'll need to adjust the `xml-model` processing instruction accordingly.
Now you're ready to go. Simply put your cursor between the start- and end-tags and press the `<` key. You'll see a list of valid elements to select from.
![Inserting a tag](first-child-tag.png)
For more information on specifics, continue with this document. But you should have enough to get started exploring.
#Namespace Specifics (and a short tutorial)
A namespace usually takes the form of a URL to make it globally unique. The namespace for this extension is `https://podcastindex.org/namespace/1.0`. In order to differentiate an element in one namespace from one having the same name in another namespace, it is necessary to preface the element name with the appropriate namespace.
Suppose, for example, an XML document is required that uses two different namespaces. One from our Podcast namespace and one from a namespace defining tags for a yearbook. They both have an element called `person`, but these are two separate elements with two different definitions and usages.
This is done by including the namespace and a colon before the name of the element:
```xml
<https://podcastindex.org/namespace/1.0:person>Person in the Podcast namespace</https://podcastindex.org/namespace/1.0:person>
```
This is uniquely different from this:
```xml
<http://yearbook.com/namespace:person>Person in the Yearbook namespace</https://yearbook.com/namespace:person>
```
But you can see that putting this namespace in front of each start tag and end tag will make the document long and hard to read. This is why the concept of namespace aliases was developed.
In the top of a document, you can specify the namespace and give it a (hopefully shorter) alias, which is then used at the beginning of each start tag and end tag. This is called the XML Namespace Declaration (`xmlns`):
```xml
<doc xmlns:podcast="https://podcastindex.org/namespace/1.0"
xmlns:yearbook="http://yearbook.com/namespace">
<podcast:person>Person in the Podcast namespace</podcast:person>
<yearbook:person>Person in the Yearbook namespace</yearbook:person>
```
These are two verifiably distinct elements that can be handled separately with no confusion by the application.
Note that the namespace alias is local to the document. The following snippet is syntactially identical to the previous one:
```xml
<doc xmlns:p="https://podcastindex.org/namespace/1.0"
xmlns:y="http://yearbook.com/namespace">
<p:person>Person in the Podcast namespace</p:person>
<y:person>Person in the Yearbook namespace</y:person>
```
You can also specify a namespace to be the default namespace. Any element or attribute that is not prefixed is said to be a member of the default namespace. So the following snipped is syntactically identical to the first two:
```xml
<doc xmlns:p="https://podcastindex.org/namespace/1.0"
xmlns="http://yearbook.com/namespace">
<p:person>Person in the Podcast namespace</p:person>
<person>Person in the Yearbook namespace</person>
```
This is, in fact, how the RSS feed works. To add our Podcast namespace to this feed, we must assume that the RSS schema is a member of the default namespace, so we must declare our namespace as a guest with an alias:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:podcast="https://podcastindex.org/namespace/1.0"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>
<title>Podcasting 2.0 Namespace Example</title>
<description>This is a fake show that exists only as an example of the "podcast" namespace tag usage.</description>
...
<podcast:locked owner="podcastowner@example.com">yes</podcast:locked>
<podcast:funding url="https://example.com/donate">Support the show!</podcast:funding>
<podcast:location geo="geo:30.2672,97.7431" osm="R113314">Austin, TX</podcast:location>
<itunes:author>John Doe</itunes:author>
<itunes:explicit>no</itunes:explicit>
<itunes:type>episodic</itunes:type>
<itunes:category text="News"/>
<itunes:category text="Technology"/>
...
```
Notice that two `xmlns` declarations are in the start tag, `rss`. Also notice how they are given their own namespace alias. You can see in the example that those elements in the podcast namespace are prefixed differently than those in the iTunes namespace.
But where is the namespace for RSS? This is where we get into implementation-specific shortcuts. Technically, the RSS namespace should have an `xmlns` declaration, which would indicate which namespace all of the non-prefixed tags belong to. But in the implementation of this, the implementor can infer the RSS namespace without it being explicitly specified.
#Using the Podcast Index XML Schema
One of the advantages of having a formalized schema is that tools that support schemas will be able to assist the developer in creating documents and applications.
Visual Studio Code, for example, has several XML add-ins that support auto-complete processing of tags defined in an arbitrary XML Schema. For those not familiar with the Microsoft ecosystem, this is called Intellisense. VS Code is a free editor that is similar to Eclipse and Atom.
Pressing the `<` key will bring up a list of elements that are valid at that point in the document. Since the Podcast namespace is just a flat list of elements (with the exception of value, which has a single sub-element), then you get a list of all elements.
![Inserting a tag](start-tag-completion.png)
It also shows documentation that exists in the schema to help you select what element you want. Picking the element will insert the start- and end-tags and put the cursor in the text area:
![Inserting a tag](tag-inserted.png)
Hovering over any element or attribute name will also pop up the documentation associated with each object:
![Hovering over a tag](tag-hover.png)
The XML extension used to create these screen shots is the `redhat.vscode-xml` add-on available in Visual Studio Code. While this particular extension auto-completes all required attributes, it does not prompt you for a list optional attributes. Perhaps they will add this functionality, or I'll update this document if I should find an extension that provides that functionality.
#To Do
* This schema defines only the tags specified by the Podcast Index namespace. A helpful addition to this effort would be to integrate the formal RSS and iTunes namespaces into the project and provide a single, validatable authoring environment for developers to learn the syntax and also to validate instances programmatically.
* The wording in the annotation/documentation tags was taken directly out of the tag documentation on the project site. The descriptions might not be appropriate for use in an editor as a quick reference. The wording could probably be tweaked to make it more appropriate for editing and app development tools.
* The schema has all of the annotation/documentation tags and content that makes it helpful for integrating into an editor that provides auto-complete authoring. These elements make the schema much larger. Perhaps a second schema could be created that strips out all of this material for a slimmed-down version for machine use. For example, this:
```xml
<xs:attribute name="url" use="required">
<xs:annotation>
<xs:documentation>
URL of the podcast transcript.
</xs:documentation>
</xs:annotation>
</xs:attribute>
```
...would become this:
```xml
<xs:attribute name="url" use="required"/>
```

Wyświetl plik

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://podcastindex.org/namespace/1.0">
<xs:include schemaLocation="./podcast.xsd"/>
<xs:element name="test-wrapper">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:any/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>

Wyświetl plik

@ -1,377 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:simpleType name="yesnoenumeration">
<xs:restriction base="xs:string">
<xs:enumeration value="yes"/>
<xs:enumeration value="no"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="max128">
<xs:restriction base="xs:string">
<xs:maxLength value="128"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="max32">
<xs:restriction base="xs:string">
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="transcript">
<xs:annotation>
<xs:documentation>
This tag is used to link to a transcript or closed captions file. Multiple tags can be present for multiple transcript formats.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="url" use="required">
<xs:annotation>
<xs:documentation>
URL of the podcast transcript.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="type" use="required">
<xs:annotation>
<xs:documentation>
Mime type of the file such as text/plain, text/html, application/srt, text/vtt, application/json
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="language" use="optional">
<xs:annotation>
<xs:documentation>
The language of the linked transcript. If there is no language attribute given, the linked file is assumed to be the same language that is specified by the RSS language element.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="rel" use="optional"> <!-- can this only be "captions"? -->
<xs:annotation>
<xs:documentation>
If the rel="captions" attribute is present, the linked file is considered to be a closed captions file, regardless of what the mime type is. In that scenario, time codes are assumed to be present in the file in some capacity.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="locked">
<xs:annotation>
<xs:documentation>
This tag may be set to yes or no. The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.
</xs:documentation>
</xs:annotation>
<xs:complexType mixed="true">
<xs:simpleContent>
<xs:extension base="yesnoenumeration">
<xs:attribute name="owner" use="required">
<xs:annotation>
<xs:documentation>
The owner attribute is an email address that can be used to verify ownership of this feed during move and import operations. This could be a public email or a virtual email address at the hosting provider that redirects to the owner's true email address. This is a critical element, and it's expected that podcast hosting providers (if not providing virtual addresses) will allow setting this element's value in their GUI with an emphasis to their users of how important it is to have this be a valid, working email address.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="funding">
<xs:annotation>
<xs:documentation>
This tag lists possible donation/funding links for the podcast. The content of the tag is the recommended string to be used with the link.
</xs:documentation>
</xs:annotation>
<xs:complexType mixed="true">
<xs:simpleContent>
<xs:extension base="max128">
<xs:attribute name="url" use="required">
<xs:annotation>
<xs:documentation>
The URL to be followed to fund the podcast.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="chapters">
<xs:annotation>
<xs:documentation>
Links to an external file (see example file) containing chapter data for the episode. See the jsonChapters.md file for a description of the chapter file syntax. And, see the example.json example file for a real world example.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="url" use="required">
<xs:annotation>
<xs:documentation>
The URL where the chapters file is located.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="type" use="required">
<xs:annotation>
<xs:documentation>
Mime type of file - JSON prefered, 'application/json+chapters'.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="soundbite">
<xs:annotation>
<xs:documentation>
Mime type of file - JSON prefered, 'application/json+chapters'.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="max128">
<xs:attribute name="startTime" type="xs:decimal" use="required">
<xs:annotation>
<xs:documentation>
The time where the soundbite begins
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="duration" type="xs:decimal" use="required">
<xs:annotation>
<xs:documentation>
How long is the soundbite (recommended between 15 and 120 seconds)
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="nodevalue" type="xs:decimal" use="optional">
<xs:annotation>
<xs:documentation>
Used as free form string from the podcast creator to specify a title for the soundbite (null defaults to episode title)
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="person">
<xs:annotation>
<xs:documentation>
This element specifies a person of interest to the podcast. It is primarily intended to identify people like hosts, co-hosts and guests. Although, it is flexible enough to allow fuller credits to be given using the roles and groups that are listed in the Podcast Taxonomy Project
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="max128">
<xs:annotation>
<xs:documentation>
This is the full name or alias of the person. This value cannot be blank.
</xs:documentation>
</xs:annotation>
<xs:attribute name="role" use="optional">
<xs:annotation>
<xs:documentation>
Used to identify what role the person serves on the show or episode. This should be a reference to an official role within the Podcast Taxonomy Project list (see below). If role is missing then "host" is assumed.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="group" use="optional">
<xs:annotation>
<xs:documentation>
This should be a reference to an official group within the Podcast Taxonomy Project list. If group is not present, then "cast" is assumed.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="img" use="optional">
<xs:annotation>
<xs:documentation>
This is the url of a picture or avatar of the person.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="href" use="optional">
<xs:annotation>
<xs:documentation>
The url to a relevant resource of information about the person, such as a homepage or third-party profile platform. Please see the example feed for possible choices of what to use here.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="location">
<xs:annotation>
<xs:documentation>
This tag is intended to describe the location of editorial focus for a podcast's content (i.e. "what place is this podcast about?"). The tag has many use cases and is one of the more complex ones. You are highly encouraged to read the full implementation document before starting to code for it.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="max128">
<xs:attribute name="geo" use="optional">
<xs:annotation>
<xs:documentation>
This is a latitude and longitude given in "geo" notation (i.e. "geo:30.2672,97.7431"). Optional but recommended.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="osm" use="optional">
<xs:annotation>
<xs:documentation>
The Open Street Map identifier of this place, given using the OSM notation (i.e. "R113314"). Optional but recommended.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="season">
<xs:annotation>
<xs:documentation>
This element allows for identifying which episodes in a podcast are part of a particular "season", with an optional season name attached.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="name" use="required">
<xs:annotation>
<xs:documentation>
This is the "name" of the season. If this attribute is present, applications are free to not show the season number to the end user, and may use it simply for chronological sorting and grouping purposes. Please do not exceed 128 characters for the name attribute.
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="max128"/>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="episode">
<xs:annotation>
<xs:documentation>
This element exists largely for compatibility with the season tag. But, it also allows for a similar idea to what "name" functions as in that element.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:decimal">
<xs:attribute name="display" use="optional">
<xs:annotation>
<xs:documentation>
If this attribute is present, podcast apps and aggregators are encouraged to show it's value instead of the purely numerical node value. This attribute is a string. Please do not exceed 32 characters for the display attribute.
</xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="max32"/>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="value">
<xs:annotation>
<xs:documentation>
designates the cryptocurrency or payment layer that will be used, the transport method for transacting the payments, and a suggested amount denominated in the given cryptocurrency.
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="valueRecipient" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" use="optional">
<xs:annotation>
<xs:documentation>
A free-form string that designates who or what this recipient is. Recommended.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="customKey" use="optional">
<xs:annotation>
<xs:documentation>
The name of a custom record key to send along with the payment.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="customValue" use="optional">
<xs:annotation>
<xs:documentation>
A custom value to pass along with the payment. This is considered the value that belongs to the customKey.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="type" use="required">
<xs:annotation>
<xs:documentation>
A slug that represents the type of receiving address that will receive the payment.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="address" use="required">
<xs:annotation>
<xs:documentation>
This denotes the receiving address of the payee.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="split" type="xs:integer" use="required">
<xs:annotation>
<xs:documentation>
The number of shares of the payment this recipient will receive.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="fee" type="xs:boolean" default="true">
<xs:annotation>
<xs:documentation>
The fee attribute tells apps whether this split should be treated as a "fee", or a normal split.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="type" use="required">
<xs:annotation>
<xs:documentation>
This is the service slug of the cryptocurrency or protocol layer.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="method" use="required">
<xs:annotation>
<xs:documentation>
This is the transport mechanism that will be used.
</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="suggested" type="xs:decimal" use="optional">
<xs:annotation>
<xs:documentation>
This is an optional suggestion on how much cryptocurrency to send with each payment.
</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<!-- BT: I can't find documentation for this -->
<xs:element name="images">
<xs:complexType>
<xs:attribute name="srcset" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 91 KiB

Wyświetl plik

@ -1,13 +0,0 @@
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="xs:annotation" />
</xsl:stylesheet>

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 70 KiB

Plik binarny nie jest wyświetlany.

Przed

Szerokość:  |  Wysokość:  |  Rozmiar: 43 KiB