<transform
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:html="http://www.w3.org/1999/xhtml"
+ xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4"
version="1.0"
>
+ <书社:id>example:text/plain</书社:id>
<template match="html:script[@type='text/plain']">
<html:pre><value-of select="."/></html:pre>
</template>
on the root element of the parser to override media type support
detection.
-Parsers can also target specific dialects of X·M·L, in which case they
- operate on the same basic principles as transforms (described below).
+Even when `@书社:supported-media-types` is set, it is a requirement
+ that each parser transform any `<html:script>` elements with a
+ `@type` which matches their registered types into something else.
+Otherwise the parser will be stuck in an endless loop.
+The result tree of applying the transform to the `<html:script>`
+ element will be reparsed (in case any new `<html:script>` elements
+ were added in its subtree), and a `@书社:parsed-by` attribute will be
+ added to each toplevel element in the result.
+The value of this attribute will be the value of the `<书社:id>`
+ toplevel element in the parser.
+
+It is possible for parsers to support zero plaintext types.
+This is useful when targeting specific dialects of X·M·L; parsers in
+ this sense operate on the same basic principles as transforms
+ (described below).
The major distinction between X·M·L parsers and transforms is where in
the process the transformation happens:
Parsers are applied *prior* to embedding (and can be used to generate
<transform
xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:catalog="urn:oasis:names:tc:entity:xmlns:xml:catalog"
+ xmlns:exsl="http://exslt.org/common"
xmlns:exslstr="http://exslt.org/strings"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
</if>
</xslt:include>
</for-each>
+ <xslt:template name="书社:apply-parsed-by">
+ <xslt:param name="id"/>
+ <xslt:param name="result" select="/.."/>
+ <xslt:for-each select="$result/node()">
+ <xslt:copy>
+ <xslt:attribute name="书社:parsed-by">
+ <xslt:value-of select="$id"/>
+ <xslt:if test="@书社:parsed-by">
+ <xslt:text> </xslt:text>
+ <xslt:value-of select="@书社:parsed-by"/>
+ </xslt:if>
+ </xslt:attribute>
+ <xslt:copy-of select="@*[not(namespace-uri()='urn:fdc:ladys.computer:20231231:Shu1She4' and local-name()='parsed-by')]|node()"/>
+ </xslt:copy>
+ </xslt:for-each>
+ </xslt:template>
+ <xslt:template match="/">
+ <xslt:apply-templates select="node()" mode="书社:parse"/>
+ </xslt:template>
<xslt:template match="@*|node()" priority="-1">
<xslt:copy>
- <xslt:apply-templates select="@*|node()"/>
+ <xslt:apply-templates select="@*|node()" mode="书社:parse"/>
</xslt:copy>
</xslt:template>
+ <xslt:template match="html:script[@type]" mode="书社:parse" priority="1">
+ <xslt:variable name="parserdiv" select="exsl:node-set($书社:parsers)//html:div[html:dd=current()/@type]"/>
+ <xslt:choose>
+ <xslt:when test="$parserdiv">
+ <xslt:variable name="result">
+ <xslt:apply-templates select="."/>
+ </xslt:variable>
+ <xslt:variable name="reparsed-result">
+ <xslt:apply-templates select="exsl:node-set($result)/node()" mode="书社:parse"/>
+ </xslt:variable>
+ <xslt:call-template name="书社:apply-parsed-by">
+ <xslt:with-param name="id" select="$parserdiv/html:dt"/>
+ <xslt:with-param name="result" select="exsl:node-set($reparsed-result)"/>
+ </xslt:call-template>
+ </xslt:when>
+ <xslt:otherwise>
+ <xslt:apply-templates select="."/>
+ </xslt:otherwise>
+ </xslt:choose>
+ </xslt:template>
+ <xslt:template match="@*|node()" mode="书社:parse">
+ <xslt:apply-templates select="."/>
+ </xslt:template>
</xslt:transform>
</template>
<output method="xml" encoding="UTF-8"/>