X-Git-Url: https://git.ladys.computer/Shushe/blobdiff_plain/c00fbad125caaac8be191801ca47a6971007fbad..5c2f4a2d2c9913196c6092f0f72a8c4ff6e76752:/lib/catalog2transform.xslt diff --git a/lib/catalog2transform.xslt b/lib/catalog2transform.xslt index b53e12a..b93aa37 100644 --- a/lib/catalog2transform.xslt +++ b/lib/catalog2transform.xslt @@ -1,57 +1,113 @@ <?xml version="1.0"?> <!-- -⁌ ⛩️📰 书社 ∷ lib/catalog2transform.xslt +SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady> +SPDX-License-Identifier: MPL-2.0 +--> +<!-- +⁌ ⛩📰 书社 ∷ lib/catalog2transform.xslt -© 2023–2024 Lady [@ Lady’s Computer] +© 2023–2024 Lady [@ Ladys Computer]. This Source Code Form is subject to the terms of the Mozilla Public License, v 2.0. If a copy of the M·P·L was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0/>. --> <!DOCTYPE transform [ <!ENTITY 书社 "urn:fdc:ladys.computer:20231231:Shu1She4"> + <!ENTITY xhtml "http://www.w3.org/1999/xhtml"> <!ENTITY xml "http://www.w3.org/XML/1998/namespace"> ]> <transform xmlns="http://www.w3.org/1999/XSL/Transform" - xmlns:html="http://www.w3.org/1999/xhtml" xmlns:catalog="urn:oasis:names:tc:entity:xmlns:xml:catalog" xmlns:exsl="http://exslt.org/common" + xmlns:exslfunc="http://exslt.org/functions" xmlns:exslstr="http://exslt.org/strings" + xmlns:html="&xhtml;" + xmlns:nie="http://www.semanticdesktop.org/ontologies/2007/01/19/nie#" + xmlns:nfo="http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xslt="http://www.w3.org/1999/XSL/TransformAlias" xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4" + xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:" + exclude-result-prefixes="catalog" version="1.0" > + <include href="literally.xslt"/> <namespace-alias stylesheet-prefix="xslt" result-prefix="#default"/> + <param name="METADATA" select="'about:blank'"/> + <variable name="builddir" select="document($METADATA)//书社vocab:BuildDirectory/@nfo:fileUrl"/> <template match="/"> - <xslt:transform exclude-result-prefixes="catalog exsl exslstr" version="1.0"> + <variable name="ids"> + <for-each select="//catalog:uri[@name]"> + <书社:id> + <value-of select="@name"/> + </书社:id> + </for-each> + </variable> + <variable name="unique-ids"> + <for-each select="exsl:node-set($ids)/*"> + <if test="not(preceding-sibling::*[string(.)=string(current())])"> + <copy-of select="."/> + </if> + </for-each> + </variable> + <xslt:transform exclude-result-prefixes="nie nfo" extension-element-prefixes="exsl exslfunc exslstr" version="1.0"> <xslt:param name="BUILDTIME" select="'1972-12-31T00:00:00Z'"/> - <xslt:param name="CKSUM" select="false"/> - <xslt:param name="CATALOG" select="'catalog'"/> - <xslt:param name="IDENTIFIER" select="false"/> - <xslt:param name="PATH" select="'/unknown'"/> - <xslt:param name="SRCREV" select="false"/> - <xslt:param name="SRCTIME" select="'1972-12-31T00:00:00Z'"/> - <xslt:param name="THISREV" select="false"/> + <xslt:param name="IDENTIFIER" select="false()"/> + <xslt:param name="SRCREV" select="false()"/> + <xslt:param name="THISREV" select="false()"/> + <element name="exslfunc:function"> + <attribute name="name"> + <text>书社:document-with-attributes-applied</text> + </attribute> + <xslt:param name="document" select="/.."/> + <xslt:variable name="application-result-fragment"> + <xslt:variable name="result-nodes" select="$document/node()[not(self::书社:apply-attributes-to-root)]|$document/书社:apply-attributes-to-root//node()[not(self::书社:apply-attributes-to-root) and not(ancestor::*[not(self::书社:apply-attributes-to-root)])]"/> + <xslt:variable name="root-with-attributes"> + <xslt:call-template name="书社:apply-attributes"> + <xslt:with-param name="context-nodes" select="$document//书社:apply-attributes-to-root"/> + <xslt:with-param name="destination-nodes" select="$result-nodes"/> + </xslt:call-template> + </xslt:variable> + <xslt:apply-templates select="exsl:node-set($root-with-attributes)" mode="书社:apply"/> + </xslt:variable> + <element name="exslfunc:result"> + <attribute name="select"> + <text>exsl:node-set($application-result-fragment)</text> + </attribute> + </element> + </element> <xslt:variable name="书社:source" select="/"/> - <xslt:variable name="书社:expansion"> + <xslt:variable name="书社:about-fragment"> + <apply-templates select="document($METADATA)" mode="书社:literally"> + <with-param name="extension-element-namespaces" select="'http://exslt.org/common http://exslt.org/functions http://exslt.org/strings'"/> + </apply-templates> + </xslt:variable> + <xslt:variable name="书社:about" select="exsl:node-set($书社:about-fragment)"/> + <xslt:variable name="书社:expansion-fragment"> <xslt:apply-templates select="$书社:source/node()" mode="书社:expand"/> </xslt:variable> - <xslt:variable name="书社:result"> - <xslt:apply-templates select="exsl:node-set($书社:expansion)/node()"/> + <xslt:variable name="书社:expansion" select="书社:document-with-attributes-applied(exsl:node-set($书社:expansion-fragment))"/> + <xslt:variable name="书社:result-fragment"> + <xslt:element name="书社:apply-attributes-to-root"> + <xslt:attribute name="书社:version"> + <xslt:value-of select="$THISREV"/> + </xslt:attribute> + <xslt:apply-templates select="$书社:expansion/node()"/> + </xslt:element> </xslt:variable> + <xslt:variable name="书社:result" select="书社:document-with-attributes-applied(exsl:node-set($书社:result-fragment))"/> + <xslt:variable name="书社:destination" select="string($书社:about//*[@rdf:about=$IDENTIFIER]/@书社vocab:destination)"/> <for-each select="//catalog:uri"> <xslt:include href="{@uri}"> - <if test="contains(@name, ':')"> - <attribute name="书社:id"> - <value-of select="@name"/> - </attribute> - </if> + <attribute name="书社:id"> + <value-of select="@name"/> + </attribute> </xslt:include> </for-each> <xslt:template name="书社:apply-attributes"> - <xslt:param name="and-version" select="false"/> <xslt:param name="context-nodes" select="/.."/> <xslt:param name="destination-nodes" select="/.."/> <xslt:variable name="additional-attributes" select="$context-nodes/@*"/> @@ -95,11 +151,6 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:choose> </xslt:variable> <xslt:copy> - <xslt:if test="$and-version and $THISREV"> - <xslt:attribute name="书社:version"> - <xslt:value-of select="$THISREV"/> - </xslt:attribute> - </xslt:if> <xslt:if test="string($lang)!=''"> <xslt:if test="self::html:* or self::svg:*"> <xslt:attribute name="lang"> @@ -114,7 +165,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <xslt:choose> <xslt:when test="@namespace-uri='&xml;'"/> <xslt:when test="$context[self::html:* or self::svg:*] and @namespace-uri='' and @local-name='lang'"/> - <xslt:when test="@namespace-uri='&书社;' and (@local-name='destination' or @local-name='disable-output-wrapping' or @local-name='version')"/> + <xslt:when test="@namespace-uri='&书社;' and (@local-name='destination' or @local-name='disable-output-wrapping')"/> <xslt:when test="preceding-sibling::*[@local-name=current()/@local-name and @namespace-uri=current()/@namespace-uri]"/> <xslt:otherwise> <xslt:attribute> @@ -160,16 +211,23 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:template> <xslt:template name="书社:wrap"> <xslt:param name="nodes" select="/.."/> - <xslt:variable name="modalinput"> + <xslt:variable name="modalinput-fragment"> <xslt:copy-of select="$nodes"/> - <xslt:copy-of select="document('')/xslt:transform/xslt:include"/> + <apply-templates select="exsl:node-set($unique-ids)" mode="书社:literally"/> </xslt:variable> - <xslt:variable name="metadata"> + <xslt:variable name="modalinput" select="exsl:node-set($modalinput-fragment)"/> + <xslt:variable name="metadata-fragment"> <xslt:copy-of select="$nodes[self::html:html]/html:head/node()|$nodes[self::html:head]/node()"/> - <xslt:apply-templates select="exsl:node-set($modalinput)/node()" mode="书社:metadata"/> + <xslt:apply-templates select="$modalinput/node()" mode="书社:metadata"/> </xslt:variable> - <html:html> + <xslt:variable name="metadata" select="exsl:node-set($metadata-fragment)"/> + <xslt:element name="html" namespace="&xhtml;"> <xslt:copy-of select="$nodes[self::html:html]/@*"/> + <xslt:if test="not($nodes[self::html:html]/@书社:archived-as) and $nodes/@书社:archived-as"> + <xslt:attribute name="书社:archived-as"> + <xslt:value-of select="$nodes/@书社:archived-as"/> + </xslt:attribute> + </xslt:if> <xslt:if test="not($nodes[self::html:html]/@lang) and $nodes[self::html:*]/@lang|$nodes[self::svg:*]/@lang|$nodes/@xml:lang"> <xslt:attribute name="lang"> <xslt:value-of select="$nodes[self::html:*]/@lang|$nodes[self::svg:*]/@lang|$nodes/@xml:lang"/> @@ -180,10 +238,10 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <xslt:value-of select="$nodes[self::html:*]/@lang|$nodes[self::svg:*]/@lang|$nodes/@xml:lang"/> </xslt:attribute> </xslt:if> - <html:head> + <xslt:element name="head" namespace="&xhtml;"> <xslt:copy-of select="$nodes[self::html:html]/html:head/@*|$nodes[self::html:head]/@*"/> - <html:title> - <xslt:for-each select="exsl:node-set($metadata)/html:title"> + <xslt:element name="title" namespace="&xhtml;"> + <xslt:for-each select="$metadata/html:title"> <xslt:value-of select="."/> <xslt:if test="position()!=last()"> <xslt:text> @@ -191,18 +249,23 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:text> </xslt:if> </xslt:for-each> - </html:title> - <xslt:copy-of select="exsl:node-set($metadata)/node()[not(self::html:title)]"/> - <html:meta name="generator"> + </xslt:element> + <xslt:copy-of select="$metadata/node()[not(self::html:title or self::html:meta and @name='generator')]"/> + <xslt:element name="meta" namespace="&xhtml;"> + <xslt:attribute name="name"> + <xslt:text> + <text>generator</text> + </xslt:text> + </xslt:attribute> <xslt:attribute name="content"> - <xslt:for-each select="exsl:node-set($metadata)/html:meta[@name='generator']"> + <xslt:for-each select="$metadata/html:meta[@name='generator']"> <xslt:value-of select="@content"/> <xslt:text> <text>, </text> </xslt:text> </xslt:for-each> <xslt:text> - <text>⛩️📰 书社</text> + <text>⛩📰 书社</text> </xslt:text> <xslt:if test="$THISREV"> <xslt:text> @@ -214,145 +277,246 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:text> </xslt:if> </xslt:attribute> - </html:meta> - </html:head> - <html:body> + </xslt:element> + </xslt:element> + <xslt:element name="body" namespace="&xhtml;"> <xslt:copy-of select="$nodes[self::html:html]/html:body/@*|$nodes[self::html:body]/@*"/> - <xslt:apply-templates select="exsl:node-set($modalinput)/node()" mode="书社:header"/> + <xslt:apply-templates select="$modalinput/node()" mode="书社:header"/> <xslt:copy-of select="$nodes[not(self::html:html or self::html:head or self::html:body)]|$nodes[self::html:html]/node()[not(self::html:head or self::html:body)]|$nodes[self::html:html]/html:body/node()|$nodes[self::html:body]/node()"/> - <xslt:apply-templates select="exsl:node-set($modalinput)/node()" mode="书社:footer"/> - </html:body> - </html:html> + <xslt:apply-templates select="$modalinput/node()" mode="书社:footer"/> + </xslt:element> + </xslt:element> </xslt:template> - <xslt:template match="/" priority="1"> - <xslt:variable name="result-nodes" select="exsl:node-set($书社:result)/node()[not(self::书社:apply-attributes-to-root)]|exsl:node-set($书社:result)/书社:apply-attributes-to-root/descendant::node()[not(self::书社:apply-attributes-to-root) and not(ancestor::*[not(self::书社:apply-attributes-to-root)])]"/> - <xslt:variable name="root-with-attributes"> - <xslt:choose> - <xslt:when test="$result-nodes/@书社:disable-output-wrapping|exsl:node-set($书社:result)//书社:apply-attributes-to-root/@书社:disable-output-wrapping"> - <xslt:call-template name="书社:apply-attributes"> - <xslt:with-param name="and-version" select="true"/> - <xslt:with-param name="context-nodes" select="exsl:node-set($书社:result)//书社:apply-attributes-to-root"/> - <xslt:with-param name="destination-nodes" select="$result-nodes"/> - </xslt:call-template> - </xslt:when> - <xslt:otherwise> - <xslt:variable name="wrapped-result"> - <xslt:call-template name="书社:wrap"> - <xslt:with-param name="nodes" select="$result-nodes"/> - </xslt:call-template> - </xslt:variable> - <xslt:call-template name="书社:apply-attributes"> - <xslt:with-param name="and-version" select="true"/> - <xslt:with-param name="context-nodes" select="exsl:node-set($书社:result)//书社:apply-attributes-to-root"/> - <xslt:with-param name="destination-nodes" select="exsl:node-set($wrapped-result)/node()"/> - </xslt:call-template> - </xslt:otherwise> - </xslt:choose> + <xslt:template match="/"> + <xslt:variable name="finalization-fragment"> + <xslt:apply-templates select="$书社:result" mode="书社:finalize"/> </xslt:variable> - <xslt:apply-templates select="exsl:node-set($root-with-attributes)/node()" mode="书社:application"/> + <xslt:copy-of select="书社:document-with-attributes-applied(exsl:node-set($finalization-fragment))"/> </xslt:template> <xslt:template match="@*|node()" priority="-1"> <xslt:copy> <xslt:apply-templates select="@*|node()"/> </xslt:copy> </xslt:template> - <xslt:template match="@*|node()" mode="书社:application"> - <xslt:copy> - <xslt:apply-templates select="@*|node()" mode="书社:application"/> - </xslt:copy> - </xslt:template> - <xslt:template match="@书社:destination|@书社:disable-output-wrapping" mode="书社:application" priority="1"/> - <xslt:template match="书社:apply-attributes" mode="书社:application" priority="1"> + <xslt:template match="书社:apply-attributes" mode="书社:apply" priority="1"> <xslt:variable name="children"> - <xslt:apply-templates select="node()" mode="书社:application"/> + <xslt:apply-templates mode="书社:apply"/> </xslt:variable> <xslt:call-template name="书社:apply-attributes"> <xslt:with-param name="context-nodes" select="."/> <xslt:with-param name="destination-nodes" select="exsl:node-set($children)/node()"/> </xslt:call-template> </xslt:template> - <xslt:template match="书社:apply-attributes-to-root" mode="书社:application" priority="1"> - <xslt:apply-templates select="node()" mode="书社:application"/> + <xslt:template match="书社:apply-attributes-to-root" mode="书社:apply" priority="1"> + <xslt:apply-templates mode="书社:apply"/> + </xslt:template> + <xslt:template match="@*|node()" mode="书社:apply" priority="-1"> + <xslt:copy> + <xslt:apply-templates select="@*|node()" mode="书社:apply"/> + </xslt:copy> + </xslt:template> + <xslt:template match="书社:link[@xlink:show='embed' and (not(@xlink:actuate) or @xlink:actuate='none')]" mode="书社:expand" priority="1"> + <xslt:variable name="link" select="."/> + <xslt:variable name="identifier" select="string(@xlink:href)"/> + <xslt:variable name="is-dir" select="substring($identifier, string-length($identifier))='/'"/> + <xslt:variable name="included" select="$书社:about//*[@rdf:about=$identifier or $is-dir and starts-with(@rdf:about, $identifier)]"/> + <xslt:choose> + <xslt:when test="$included"> + <xslt:for-each select="$included"> + <xslt:sort select="@rdf:about" data-type="text" lang="zxx" case-order="upper-first"/> + <xslt:variable name="uri" select="书社vocab:hasParsedFile/@nfo:fileUrl"/> + <xslt:variable name="expanded"> + <xslt:apply-templates select="document($uri)" mode="书社:expand"> + <xslt:with-param name="identifier" select="string(@rdf:about)"/> + </xslt:apply-templates> + </xslt:variable> + <xslt:for-each select="exsl:node-set($expanded)/node()"> + <xslt:copy> + <xslt:choose> + <xslt:when test="self::html:*"> + <xslt:variable name="existing-types" select="exslstr:tokenize(@itemtype)"/> + <xslt:attribute name="itemscope">itemscope</xslt:attribute> + <xslt:attribute name="itemtype"> + <xslt:for-each select="$existing-types/token[string()!='&书社;:document']"> + <xslt:if test="position()!=1"> + <xslt:text> + <text> </text> + </xslt:text> + </xslt:if> + <xslt:value-of select="."/> + </xslt:for-each> + <xslt:if test="not($existing-types/token[string()='&书社;:embed'])"> + <xslt:if test="$existing-types/token[string()!='&书社;:document']"> + <xslt:text> + <text> </text> + </xslt:text> + </xslt:if> + <xslt:text> + <text>&书社;:embed</text> + </xslt:text> + </xslt:if> + </xslt:attribute> + <xslt:choose> + <xslt:when test="$link/@书社:archived-as"> + <xslt:copy-of select="$link/@书社:archived-as"/> + </xslt:when> + <xslt:when test="@书社:archived-as"> + <xslt:copy-of select="@书社:archived-as"/> + </xslt:when> + </xslt:choose> + <xslt:copy-of select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype')) and not(namespace-uri()='&书社;' and local-name()='archived-as')]|node()"/> + </xslt:when> + <xslt:otherwise> + <xslt:choose> + <xslt:when test="self::* and $link/@书社:archived-as"> + <xslt:copy-of select="$link/@书社:archived-as"/> + </xslt:when> + <xslt:when test="@书社:archived-as"> + <xslt:copy-of select="@书社:archived-as"/> + </xslt:when> + </xslt:choose> + <xslt:copy-of select="@*[not(namespace-uri()='&书社;' and local-name()='archived-as')]|node()"/> + </xslt:otherwise> + </xslt:choose> + </xslt:copy> + </xslt:for-each> + </xslt:for-each> + </xslt:when> + <xslt:otherwise> + <xslt:copy> + <xslt:apply-templates select="@*|node()" mode="书社:expand"/> + </xslt:copy> + </xslt:otherwise> + </xslt:choose> </xslt:template> <xslt:template match="/node()" mode="书社:expand" priority="0"> + <xslt:param name="identifier" select="$IDENTIFIER"/> <xslt:copy> - <xslt:attribute name="书社:identifier"> - <xslt:value-of select="$IDENTIFIER"/> - </xslt:attribute> + <xslt:if test="self::*"> + <xslt:attribute name="书社:cksum"> + <xslt:value-of select="$书社:about//*[@rdf:about=$identifier]/nfo:hasHash[@nfo:hashAlgorithm='CRC32']/@nfo:hashValue"/> + </xslt:attribute> + <xslt:attribute name="书社:identifier"> + <xslt:value-of select="$identifier"/> + </xslt:attribute> + <xslt:attribute name="书社:mtime"> + <xslt:value-of select="$书社:about//*[@rdf:about=$identifier]/nfo:fileLastModified"/> + </xslt:attribute> + </xslt:if> <xslt:choose> <xslt:when test="self::html:*"> + <xslt:variable name="existing-types" select="exslstr:tokenize(@itemtype)"/> <xslt:attribute name="itemscope">itemscope</xslt:attribute> <xslt:attribute name="itemtype"> - <xslt:text> - <text>&书社;:document</text> - </xslt:text> - <xslt:for-each select="exslstr:tokenize(@itemtype)/token"> - <xslt:text> - <text> </text> - </xslt:text> + <xslt:for-each select="$existing-types/token"> + <xslt:if test="position()!=1"> + <xslt:text> + <text> </text> + </xslt:text> + </xslt:if> <xslt:value-of select="."/> </xslt:for-each> + <xslt:if test="not($existing-types/token[string()='&书社;:embed' or string()='&书社;:document'])"> + <xslt:if test="$existing-types/token"> + <xslt:text> + <text> </text> + </xslt:text> + </xslt:if> + <xslt:text> + <text>&书社;:document</text> + </xslt:text> + </xslt:if> </xslt:attribute> - <xslt:apply-templates select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype'))]|node()" mode="书社:expand"/> + <xslt:apply-templates select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype') or namespace-uri()='&书社;' and (local-name()='cksum' or local-name()='identifier' or local-name()='mtime'))]|node()" mode="书社:expand"/> </xslt:when> <xslt:otherwise> - <xslt:apply-templates select="@*|node()" mode="书社:expand"/> + <xslt:apply-templates select="@*[not(namespace-uri()='&书社;' and (local-name()='cksum' or local-name()='identifier' or local-name()='mtime'))]|node()" mode="书社:expand"/> </xslt:otherwise> </xslt:choose> </xslt:copy> </xslt:template> - <xslt:template match="书社:link[@xlink:show='embed']" mode="书社:expand" priority="1"> - <xslt:variable name="identifier" select="string(@xlink:href)"/> - <xslt:variable name="uri" select="substring-before(document($CATALOG)//catalog:uri[@name=$identifier]/@uri[1], '#')"/> + <xslt:template match="@*|node()" mode="书社:expand" priority="-1"> + <xslt:copy> + <xslt:apply-templates select="@*|node()" mode="书社:expand"/> + </xslt:copy> + </xslt:template> + <xslt:template match="text()" mode="书社:header"/> + <xslt:template match="书社:archive" mode="书社:finalize" priority="1"> + <xslt:copy> + <xslt:apply-templates select="@*" mode="书社:finalize"/> + <xslt:for-each select="node()"> + <xslt:choose> + <xslt:when test="self::*"> + <xslt:variable name="component-fragment"> + <xslt:copy> + <xslt:choose> + <xslt:when test="self::html:*"> + <xslt:variable name="existing-types" select="exslstr:tokenize(@itemtype)"/> + <xslt:attribute name="itemscope">itemscope</xslt:attribute> + <xslt:attribute name="itemtype"> + <xslt:for-each select="$existing-types/token"> + <xslt:if test="position()!=1"> + <xslt:text> + <text> </text> + </xslt:text> + </xslt:if> + <xslt:value-of select="."/> + </xslt:for-each> + <xslt:if test="not($existing-types/token[string()='&书社;:embed' or string()='&书社;:document'])"> + <xslt:if test="$existing-types/token"> + <xslt:text> + <text> </text> + </xslt:text> + </xslt:if> + <xslt:text> + <text>&书社;:document</text> + </xslt:text> + </xslt:if> + </xslt:attribute> + <xslt:copy-of select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype'))]|node()"/> + </xslt:when> + <xslt:otherwise> + <xslt:copy-of select="@*|node()"/> + </xslt:otherwise> + </xslt:choose> + </xslt:copy> + </xslt:variable> + <xslt:variable name="finalization-fragment"> + <xslt:apply-templates select="exsl:node-set($component-fragment)" mode="书社:finalize"/> + </xslt:variable> + <xslt:copy-of select="书社:document-with-attributes-applied(exsl:node-set($finalization-fragment))"/> + </xslt:when> + <xslt:otherwise> + <xslt:apply-templates select="." mode="书社:finalize"/> + </xslt:otherwise> + </xslt:choose> + </xslt:for-each> + </xslt:copy> + </xslt:template> + <xslt:template match="@书社:destination|@书社:disable-output-wrapping" mode="书社:finalize" priority="1"/> + <xslt:template match="/" mode="书社:finalize"> <xslt:choose> - <xslt:when test="$uri"> - <xslt:variable name="expanded"> - <xslt:apply-templates select="document($uri)" mode="书社:expand"/> - </xslt:variable> - <xslt:for-each select="exsl:node-set($expanded)/node()"> - <xslt:copy> - <xslt:attribute name="书社:identifier"> - <xslt:value-of select="$identifier"/> - </xslt:attribute> - <xslt:choose> - <xslt:when test="self::html:*"> - <xslt:attribute name="itemscope">itemscope</xslt:attribute> - <xslt:attribute name="itemtype"> - <xslt:text> - <text>&书社;:embed</text> - </xslt:text> - <xslt:for-each select="exslstr:tokenize(@itemtype)/token[string()!='&书社;:document']"> - <xslt:text> - <text> </text> - </xslt:text> - <xslt:value-of select="."/> - </xslt:for-each> - </xslt:attribute> - <xslt:copy-of select="@*[not(namespace-uri()='' and (local-name()='itemscope' or local-name()='itemtype')) and not(namespace-uri()='&书社;' and local-name()='identifier')]|node()"/> - </xslt:when> - <xslt:otherwise> - <xslt:apply-templates select="@*[not(namespace-uri()='&书社;' and local-name()='identifier')]|node()" mode="书社:expand"/> - </xslt:otherwise> - </xslt:choose> - </xslt:copy> - </xslt:for-each> + <xslt:when test="not(html:*) or 书社:raw-text or 书社:base64-binary or 书社:archive or */@书社:disable-output-wrapping"> + <xslt:apply-templates mode="书社:finalize"/> </xslt:when> <xslt:otherwise> - <xslt:copy> - <xslt:apply-templates select="@*|node()" mode="书社:expand"/> - </xslt:copy> + <xslt:variable name="wrapped-result"> + <xslt:call-template name="书社:wrap"> + <xslt:with-param name="nodes" select="node()"/> + </xslt:call-template> + </xslt:variable> + <xslt:apply-templates select="exsl:node-set($wrapped-result)/node()" mode="书社:finalize"/> </xslt:otherwise> </xslt:choose> </xslt:template> - <xslt:template match="@*|node()[not(self::书社:link) or not(@xlink:show='embed')]" mode="书社:expand" priority="-1"> + <xslt:template match="@*|node()" mode="书社:finalize" priority="-1"> <xslt:copy> - <xslt:apply-templates select="@*|node()" mode="书社:expand"/> + <xslt:apply-templates select="@*|node()" mode="书社:finalize"/> </xslt:copy> </xslt:template> - <xslt:template match="text()" mode="书社:header"/> <xslt:template match="text()" mode="书社:footer"/> <xslt:template match="text()" mode="书社:metadata"/> - <xslt:output method="xml" encoding="UTF-8" cdata-section-elements="html:script html:style html:textarea"/> + <xslt:output method="xml" encoding="UTF-8" cdata-section-elements="html:script html:style html:textarea 书社:raw-output 书社:raw-text"/> </xslt:transform> </template> <output method="xml" encoding="UTF-8"/>