X-Git-Url: https://git.ladys.computer/Shushe/blobdiff_plain/f83690a5b2bbe2d1781f0c2381022da5587f0161..ca7be60f15de191e25f8cc1890e13dc499576ec4:/lib/catalog2transform.xslt diff --git a/lib/catalog2transform.xslt b/lib/catalog2transform.xslt index 6d721a7..ce94067 100644 --- a/lib/catalog2transform.xslt +++ b/lib/catalog2transform.xslt @@ -1,26 +1,28 @@ <?xml version="1.0"?> <!-- -SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady> +SPDX-FileCopyrightText: 2023, 2024, 2025 Lady <https://www.ladys.computer/about/#lady> SPDX-License-Identifier: MPL-2.0 --> <!-- ⁌ ⛩📰 书社 ∷ lib/catalog2transform.xslt -© 2023–2024 Lady [@ Ladys Computer]. +© 2023–2025 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: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="http://www.w3.org/1999/xhtml" + 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#" @@ -51,26 +53,52 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </if> </for-each> </variable> - <xslt:transform exclude-result-prefixes="nie nfo" extension-element-prefixes="exsl exslstr" version="1.0"> + <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="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="书社:about-fragment"> <apply-templates select="document($METADATA)" mode="书社:literally"> - <with-param name="extension-element-namespaces" select="'http://exslt.org/common http://exslt.org/strings'"/> + <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="书社:expansion" select="exsl:node-set($书社:expansion-fragment)"/> + <xslt:variable name="书社:expansion" select="书社:document-with-attributes-applied(exsl:node-set($书社:expansion-fragment))"/> <xslt:variable name="书社:result-fragment"> - <xslt:apply-templates select="$书社:expansion/node()"/> + <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="exsl:node-set($书社:result-fragment)"/> + <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}"> @@ -80,7 +108,6 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </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/@*"/> @@ -124,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"> @@ -143,8 +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='archived-as' and not($context-nodes/ancestor::*[not(self::书社:apply-attributes-to-root or self::书社:apply-attributes)][1][self::书社:archive])"/> - <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> @@ -200,7 +221,7 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <xslt:apply-templates select="$modalinput/node()" mode="书社:metadata"/> </xslt:variable> <xslt:variable name="metadata" select="exsl:node-set($metadata-fragment)"/> - <html:html> + <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"> @@ -217,9 +238,9 @@ 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:element name="title" namespace="&xhtml;"> <xslt:for-each select="$metadata/html:title"> <xslt:value-of select="."/> <xslt:if test="position()!=last()"> @@ -228,9 +249,14 @@ 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:element> <xslt:copy-of select="$metadata/node()[not(self::html:title or self::html:meta and @name='generator')]"/> - <html:meta 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="$metadata/html:meta[@name='generator']"> <xslt:value-of select="@content"/> @@ -251,88 +277,31 @@ 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:copy-of select="$nodes[self::html:html]/html:body/@*|$nodes[self::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]/@*)[not(namespace-uri()='&书社;' and local-name()='archived-as')]"/> <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:for-each 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:copy> + <xslt:copy-of select="@*[not(namespace-uri()='&书社;' and local-name()='archived-as')]|node()"/> + </xslt:copy> + </xslt:for-each> <xslt:apply-templates select="$modalinput/node()" mode="书社:footer"/> - </html:body> - </html:html> + </xslt:element> + </xslt:element> </xslt:template> - <xslt:template match="/" priority="1"> - <xslt:variable name="result-nodes" select="$书社:result/node()[not(self::书社:apply-attributes-to-root)]|$书社: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="not($result-nodes/self::html:*) or $result-nodes/self::书社:*[local-name()='raw-text' or local-name()='base64-binary' or local-name()='archive'] or $result-nodes/@书社:disable-output-wrapping or $书社: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="$书社: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="$书社: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="书社:apply"/> + <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="书社:apply"> - <xslt:copy> - <xslt:apply-templates select="@*|node()" mode="书社:apply"/> - </xslt:copy> - </xslt:template> - <xslt:template match="@书社:destination|@书社:disable-output-wrapping|@书社:archived-as[../ancestor::*[not(self::书社:apply-attributes-to-root or self::书社:apply-attributes)]]" mode="书社:apply" priority="1"/> - <xslt:template match="书社:archive" mode="书社:apply" priority="1"> - <xslt:copy> - <xslt:for-each select="@*"> - <xslt:choose> - <xslt:when test="local-name()='archived-as' and namespace-uri()='&书社;' and ../ancestor::*[not(self::书社:apply-attributes-to-root or self::书社:apply-attributes)]"/> - <xslt:otherwise> - <xslt:apply-templates select="." mode="书社:apply"/> - </xslt:otherwise> - </xslt:choose> - </xslt:for-each> - <xslt:for-each select="node()"> - <xslt:choose> - <xslt:when test="self::*"> - <xslt:variable name="component"> - <xslt:choose> - <xslt:when test="self::书社:*[local-name()='raw-text' or local-name()='base64-binary' or local-name()='archive']|@书社:disable-output-wrapping"> - <xslt:copy-of select="."/> - </xslt:when> - <xslt:otherwise> - <xslt:call-template name="书社:wrap"> - <xslt:with-param name="nodes" select="."/> - </xslt:call-template> - </xslt:otherwise> - </xslt:choose> - </xslt:variable> - <xslt:apply-templates select="exsl:node-set($component)/node()" mode="书社:apply"/> - </xslt:when> - <xslt:otherwise> - <xslt:apply-templates select="." mode="书社:apply"/> - </xslt:otherwise> - </xslt:choose> - </xslt:for-each> - </xslt:copy> - </xslt:template> <xslt:template match="书社:apply-attributes" mode="书社:apply" priority="1"> <xslt:variable name="children"> <xslt:apply-templates mode="书社:apply"/> @@ -345,40 +314,76 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one <xslt:template match="书社:apply-attributes-to-root" mode="书社:apply" priority="1"> <xslt:apply-templates mode="书社:apply"/> </xslt:template> - <xslt:template match="书社:link[@xlink:show='embed']" mode="书社:expand" priority="1"> + <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="included" select="$书社:about//*[@rdf:about=$identifier]"/> + <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:variable name="uri" select="$included/书社vocab:hasParsedFile/@nfo:fileUrl"/> - <xslt:variable name="expanded"> - <xslt:apply-templates select="document($uri)" mode="书社:expand"> - <xslt:with-param name="identifier" select="$identifier"/> - </xslt:apply-templates> - </xslt:variable> - <xslt:for-each select="exsl:node-set($expanded)/node()"> - <xslt:copy> - <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'))]|node()"/> - </xslt:when> - <xslt:otherwise> - <xslt:apply-templates select="@*|node()" mode="书社:expand"/> - </xslt:otherwise> - </xslt:choose> - </xslt:copy> + <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> @@ -404,17 +409,27 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </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') or namespace-uri()='&书社;' and (local-name()='cksum' or local-name()='identifier' or local-name()='mtime'))]|node()" mode="书社:expand"/> </xslt:when> @@ -424,12 +439,85 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one </xslt:choose> </xslt:copy> </xslt:template> - <xslt:template match="@*|node()[not(self::书社:link) or not(@xlink:show='embed')]" mode="书社:expand" priority="-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="not(html:*) or 书社:raw-text or 书社:base64-binary or 书社:archive or */@书社:disable-output-wrapping"> + <xslt:apply-templates mode="书社:finalize"/> + </xslt:when> + <xslt:otherwise> + <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()" mode="书社:finalize" priority="-1"> + <xslt:copy> + <xslt:apply-templates select="@*|node()" mode="书社:finalize"/> + </xslt:copy> + </xslt:template> <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 书社:raw-output 书社:raw-text"/>