From: Lady <redacted>
Date: Sun, 2 Jun 2024 01:31:55 +0000 (-0400)
Subject: Generate destinations and dependencies as metadata
X-Git-Tag: 0.11.0~1
X-Git-Url: https://git.ladys.computer/Shushe/commitdiff_plain/c4c2cfb24adfa62c6b4cbd819b7efe80438d8d08?hp=58a16f16d7dd70c9e112b51a412ea4c3925873b7

Generate destinations and dependencies as metadata

The format of this is subject to change. It might actually be desirable
to have the dependency and destination files be side·effects of the
metadata file generated alongside it (in the same `xsltproc` call)
rather than needing to generate them separately.
---

diff --git a/GNUmakefile b/GNUmakefile
index ecaade9..99e94cf 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -434,8 +434,8 @@ override parsed = $(foreach file,$1,$(patsubst $(file)|%,%,$(filter $(file)|%,$(
 # (callable) Get the source files for the given parsed file.
 override unparsed = $(foreach file,$1,$(patsubst %|$(file),%,$(filter %|$(file),$(sourceparsedpair))))
 
-# Pair each parser, transform, source file, parsed file, or metadata compilation with its file u·r·i.
-override fileuripairs := $(join $(patsubst %,%|,$(PARSERS) $(TRANSFORMS) $(sourcefiles) $(sourceincludes) $(call parsed,$(sourcefiles) $(sourceincludes)) $(BUILDDIR)/metadata),$(call pathenc,$(foreach uriable,$(PARSERS) $(TRANSFORMS) $(sourcefiles) $(sourceincludes) $(call parsed,$(sourcefiles) $(sourceincludes)) $(BUILDDIR)/metadata,file://$(abspath $(uriable)))))
+# Pair each build directory, parser, transform, or source file with its file u·r·i.
+override fileuripairs := $(join $(patsubst %,%|,$(BUILDDIR) $(PARSERS) $(TRANSFORMS) $(sourcefiles) $(sourceincludes)),$(call pathenc,$(foreach uriable,$(BUILDDIR) $(PARSERS) $(TRANSFORMS) $(sourcefiles) $(sourceincludes),file://$(abspath $(uriable)))))
 
 # (callable) Get the file u·r·is for the given parsers, transforms, parsed files, or metadata compilations.
 override fileuri = $(foreach file,$1,$(or $(patsubst $(file)|%,%,$(filter $(file)|%,$(fileuripairs))),$(error Unable to get file u·r·i for `$(file)´)))
@@ -480,10 +480,10 @@ override destinations := $(shell $(CAT) $(BUILDDIR)/destinations)
 # Pair source files and their destinations.
 override sourcedestinationpair := $(foreach destination,$(destinations),$(call sourcefile,$(firstword $(subst |, ,$(destination))))|$(call perdec,$(subst $(space),|,$(wordlist 2,$(words $(subst |, ,$(destination))),$(subst |, ,$(destination))))))
 
-# (callable) Get the destination for the given source files, or return `NOTDEF´.
+# (callable) Get the destination for the given source files, or return `.NOTDEF/$1´.
 #
-# The fallback here is because destinations are used to generate targets and thus must always be non·empty, even when they haven’t been generated yet.
-override destination = $(foreach file,$1,$(or $(patsubst $(file)|%,%,$(filter $(file)|%,$(sourcedestinationpair))),NOTDEF))
+# The fallback here is because destinations are used to generate targets and thus must always be non·empty and should be unique, even when they haven’t been generated yet.
+override destination = $(foreach file,$1,$(or $(patsubst $(file)|%,%,$(filter $(file)|%,$(sourcedestinationpair))),.NOTDEF/$1))
 
 # Pair each source file with its compiled location.
 override sourcecompiledpair := $(foreach file,$(sourcefiles),$(file)|$(BUILDDIR)/results/$(call destination,$(file)))
@@ -634,7 +634,7 @@ $(BUILDDIR)/parser.xslt : $(BUILDDIR)/parser.catalog $(THISDIR)/lib/catalog2pars
 $(call metadata,$(sourcefiles) $(sourceincludes)) : % : $$(call datadata,$$@) $(typeupdates)
 	$(call inform,$(PRINTF) '%s\n' $(call quote,Generating metadata for `$<´…) >&2)
 	$(silent)$(call ensuredirectory,$(dir $@))
-	$(silent){ if $(TEST) ! -f $(call quote,$(BUILDDIR)/.mtime); then $(PRINTF) '%b' '\n' >|$(call quote,$(BUILDDIR)/.mtime); fi; $(TOUCH) -r $(call quote,$<) $(call quote,$(BUILDDIR)/.mtime); $(DIFF) -u $(call quote,$(BUILDDIR)/.mtime) /dev/null | $(SED) '1!d;s/.*	\([^ ]*\) \([^ ]*\).*$$/\1T\2Z/'; $(CKSUM) $(call quote,$<) | $(SED) 's/[ ].*//'; } | $(xargsmultiquote) | $(XARGS) -E '' $(PRINTF) '<?xml version="1.0"?><nfo:LocalFileDataObject xmlns:dct="http://purl.org/dc/terms/" 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#" rdf:about="%s" nfo:fileName="%s" nfo:fileUrl="%s"><nie:interpretedAs>$(if $(filter $<,$(assetfiles)),<nfo:InformationElement nie:mimeType="%s"/>,<nfo:PlainTextDocument nie:mimeType="%s"/>)</nie:interpretedAs><dct:hasFormat><nfo:LocalFileDataObject nfo:fileUrl="%s"><nie:interpretedAs><nfo:PlainTextDocument nie:mimeType="application/xml"/></nie:interpretedAs></nfo:LocalFileDataObject></dct:hasFormat><nfo:fileLastModified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">%s</nfo:fileLastModified><nfo:hasHash nfo:hashAlgorithm="CRC32" nfo:hashValue="%s"/></nfo:LocalFileDataObject>' $(call quote,$(call attresc,$(call localuri,$<))) $(call quote,$(call attresc,$(notdir $<))) $(call quote,$(call attresc,$(call fileuri,$<))) $(call quote,$(call attresc,$(call typeoffile,$<))) $(call quote,$(call attresc,$(call fileuri,$(call parsed,$<)))) >|$(call quote,$@)
+	$(silent){ if $(TEST) ! -f $(call quote,$(BUILDDIR)/.mtime); then $(PRINTF) '%b' '\n' >|$(call quote,$(BUILDDIR)/.mtime); fi; $(TOUCH) -r $(call quote,$<) $(call quote,$(BUILDDIR)/.mtime); $(DIFF) -u $(call quote,$(BUILDDIR)/.mtime) /dev/null | $(SED) '1!d;s/.*	\([^ ]*\) \([^ ]*\).*$$/\1T\2Z/'; $(CKSUM) $(call quote,$<) | $(SED) 's/[ ].*//'; } | $(xargsmultiquote) | $(XARGS) -E '' $(PRINTF) '<?xml version="1.0"?><nfo:LocalFileDataObject 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#" rdf:about="%s" nfo:fileName="%s" nfo:fileUrl="%s"><nie:interpretedAs>$(if $(filter $<,$(assetfiles)),<nfo:InformationElement nie:mimeType="%s"/>,<nfo:PlainTextDocument nie:mimeType="%s"/>)</nie:interpretedAs><nfo:fileLastModified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">%s</nfo:fileLastModified><nfo:hasHash nfo:hashAlgorithm="CRC32" nfo:hashValue="%s"/></nfo:LocalFileDataObject>' $(call quote,$(call attresc,$(call localuri,$<))) $(call quote,$(call attresc,$(if $(filter $<,$(sourceincludes)),$(call includepath,$<),$(call sourcepath,$<)))) $(call quote,$(call attresc,$(call fileuri,$<))) $(call quote,$(call attresc,$(call typeoffile,$<))) >|$(call quote,$@)
 
 # Parse the files.
 #
@@ -646,12 +646,12 @@ $(call parsed,$(sourcefiles) $(sourceincludes)) : % : $$(call unparsed,$$@) $(BU
 	$(silent)$(if $(filter $<,$(assetfiles)),$(PRINTF) '%s\n' $(call quote,<?xml version="1.0"?><object xmlns="http://www.w3.org/1999/xhtml" type="$(call typeoffile,$<)" data="$(call datauri,$<)"/>) >|$(call quote,$@),$(if $(filter $<,$(plaintextfiles)),$(call wrapplaintext,$<),$(call serializexml,$<)) | $(XSLTPROC) --nonet --novalid --nomkdir --nowrite --stringparam BUILDTIME $$($(DATE) -u '+%Y-%m-%dT%H:%M:%SZ') --stringparam IDENTIFIER $(call quote,$(call localuri,$<))$(if $(THISREV), --stringparam THISREV $(call quote,$(THISREV)),)$(if $(SRCREV), --stringparam SRCREV $(call quote,$(SRCREV)),) $(call quote,$(BUILDDIR)/parser.xslt) - >|$(call quote,$@))
 
 # Collect the metadata into a single file.
-$(BUILDDIR)/metadata : $(call diffprereqs,metadatas,$(call metadata,$(sort $(sourcefiles) $(sourceincludes))))
+$(BUILDDIR)/metadata : $(call diffprereqs,metadatas,$(call metadata,$(sort $(sourcefiles) $(sourceincludes)))) $(call parsed,$(filter-out $(assetfiles),$(sourcefiles) $(sourceincludes))) $(THISDIR)/lib/expandmetadata.xslt
 	$(call inform,$(PRINTF) '%s\n' 'Compiling metadata…' >&2)
-	$(silent){ $(PRINTF) '%s' '<?xml version="1.0"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">'; $(foreach meta,$(call metadata,$(sort $(sourcefiles) $(sourceincludes))),$(CAT) $(call quote,$(meta)) | $(SED) 's/<?xml version="1.0"?>//';) $(PRINTF) '%s\n' '</rdf:RDF>'; } >|$(call quote,$@)
+	$(silent){ $(PRINTF) '<?xml version="1.0"?><rdf:RDF xmlns:dct="http://purl.org/dc/terms/" 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:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:"><nfo:LocalFileDataObject rdf:about="about:shushe?builddir" nfo:fileUrl="%s"><nie:interpretedAs><nfo:Folder/></nie:interpretedAs></nfo:LocalFileDataObject>' $(call quote,$(call attresc,$(call fileuri,$(BUILDDIR)))); { $(foreach meta,$(call metadata,$(sort $(sourcefiles) $(sourceincludes))),$(CAT) $(call quote,$(meta));) } | $(SED) 's/<?xml version="1.0"?>//g'; $(PRINTF) '%s\n' '</rdf:RDF>'; } | $(XSLTPROC) --nonet --novalid --nomkdir --nowrite $(call quote,$(THISDIR)/lib/expandmetadata.xslt) - | $(XMLLINT) --nonet --nsclean - >|$(call quote,$@)
 
 # Build a list of dependencies for each parsed file.
-$(BUILDDIR)/dependencies : $(BUILDDIR)/metadata $(call parsed,$(filter-out $(assetfiles),$(sourcefiles) $(sourceincludes))) $(THISDIR)/lib/metadata2dependencies.xslt
+$(BUILDDIR)/dependencies : $(BUILDDIR)/metadata $(THISDIR)/lib/metadata2dependencies.xslt
 	$(call inform,$(PRINTF) '%s\n' 'Identifying dependencies…' >&2)
 	$(silent)$(TOUCH) $(call quote,$@)
 	$(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite $(call quote,$(THISDIR)/lib/metadata2dependencies.xslt) $(call quote,$<) >|$(call quote,$@)
@@ -660,7 +660,7 @@ $(BUILDDIR)/dependencies : $(BUILDDIR)/metadata $(call parsed,$(filter-out $(ass
 #
 # This depends on parsing non·asset source files, but not assets or includes.
 # It does not require knowing the dependencies.
-$(BUILDDIR)/destinations : $(BUILDDIR)/metadata $(call parsed,$(filter-out $(assetfiles),$(sourcefiles))) $(THISDIR)/lib/metadata2destinations.xslt
+$(BUILDDIR)/destinations : $(BUILDDIR)/metadata $(THISDIR)/lib/metadata2destinations.xslt
 	$(call inform,$(PRINTF) '%s\n' 'Identifying output destinations…' >&2)
 	$(silent)$(TOUCH) $(call quote,$@)
 	$(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite $(call quote,$(THISDIR)/lib/metadata2destinations.xslt) $(call quote,$<) >|$(call quote,$@)
@@ -672,7 +672,7 @@ $(BUILDDIR)/transform.catalog : $(call diffprereqs,transforms,$(sort $(TRANSFORM
 	$(foreach transform,$(TRANSFORMS),$(silent){ $(call id,$(transform)); $(PRINTF) '%s\n' $(call quote,$(call fileuri,$(transform))) '--noout' $(call quote,$@); } | $(xargsmultiquote) | $(XARGS) -E '' $(XMLCATALOG) --add uri$(newline))
 $(BUILDDIR)/transform.xslt : $(BUILDDIR)/transform.catalog $(BUILDDIR)/metadata $(THISDIR)/lib/catalog2transform.xslt
 	$(call inform,$(PRINTF) '%s\n' 'Generating main transform…' >&2)
-	$(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite --stringparam METADATA $(call quote,$(call fileuri,$(BUILDDIR)/metadata)) $(call quote,$(THISDIR)/lib/catalog2transform.xslt) $(call quote,$<) >|$(call quote,$@)
+	$(silent)$(XSLTPROC) --nonet --novalid --nomkdir --nowrite --stringparam METADATA $(call quote,$(call fileuri,$(BUILDDIR))/metadata) $(call quote,$(THISDIR)/lib/catalog2transform.xslt) $(call quote,$<) >|$(call quote,$@)
 
 # Compile the result files using the dependencies as necessary.
 $(call compiled,$(compilablefiles)) : $(BUILDDIR)/results/% : $$(call parsed,$$(call uncompiled,$$@)) $$(call parsed,$$(call dependencies,$$(call uncompiled,$$@))) $(BUILDDIR)/transform.xslt $(BUILDDIR)/metadata
diff --git a/lib/expandmetadata.xslt b/lib/expandmetadata.xslt
new file mode 100644
index 0000000..e75fe23
--- /dev/null
+++ b/lib/expandmetadata.xslt
@@ -0,0 +1,160 @@
+<?xml version="1.0"?>
+<!--
+SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady>
+SPDX-License-Identifier: MPL-2.0
+-->
+<!--
+⁌ ⛩📰 书社 ∷ lib/expandmetadata.xslt
+
+© 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/>.
+-->
+<transform
+	xmlns="http://www.w3.org/1999/XSL/Transform"
+	xmlns:dct="http://purl.org/dc/terms/"
+	xmlns:exsl="http://exslt.org/common"
+	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:xlink="http://www.w3.org/1999/xlink"
+	xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4"
+	xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:"
+	extension-element-prefixes="exsl"
+	version="1.0"
+>
+	<variable name="builddir" select="//*[@rdf:about='about:shushe?builddir']/@nfo:fileUrl"/>
+	<variable name="files" select="/rdf:RDF/nfo:LocalFileDataObject[not(nie:interpretedAs/nfo:Folder)]"/>
+	<template name="书社:process-dependencies">
+		<param name="processed"/>
+		<param name="unprocessed"/>
+		<variable name="queue">
+			<copy-of select="exsl:node-set($unprocessed)/书社:dependency-root"/>
+			<for-each select="exsl:node-set($unprocessed)/书社:dependency">
+				<if test="not((exsl:node-set($processed)/书社:*|preceding-sibling::书社:*|following-sibling::书社:recursive-dependency)[string()=string(current())])">
+					<copy-of select="."/>
+				</if>
+			</for-each>
+		</variable>
+		<variable name="old">
+			<copy-of select="exsl:node-set($processed)/书社:dependency-root"/>
+			<copy-of select="exsl:node-set($processed)/书社:recursive-dependency"/>
+			<for-each select="exsl:node-set($unprocessed)/书社:recursive-dependency">
+				<if test="not((exsl:node-set($processed)/书社:recursive-dependency|preceding-sibling::书社:recursive-dependency)[string()=string(current())])">
+					<copy-of select="."/>
+				</if>
+			</for-each>
+			<for-each select="exsl:node-set($processed)/书社:dependency">
+				<if test="not(exsl:node-set($unprocessed)/书社:recursive-dependency[string()=string(current())])">
+					<copy-of select="."/>
+				</if>
+			</for-each>
+			<copy-of select="$queue"/>
+		</variable>
+		<variable name="new">
+			<for-each select="exsl:node-set($queue)/书社:*">
+				<for-each select="$files[@rdf:about=string(current()) and nie:interpretedAs/nfo:PlainTextDocument]">
+					<variable name="parent" select="@rdf:about"/>
+					<variable name="subdir">
+						<choose>
+							<when test="starts-with($parent, 'about:shushe?include=')">
+								<text>/includes/</text>
+							</when>
+							<when test="starts-with($parent, 'about:shushe?source=')">
+								<text>/sources/</text>
+							</when>
+						</choose>
+					</variable>
+					<for-each select="document(concat($builddir, $subdir, @nfo:fileName), .)//书社:link[@xlink:show='embed']">
+						<if test="exsl:node-set($old)/书社:dependency-root[string()=string(current()/@xlink:href)]">
+							<书社:recursive-dependency>
+								<value-of select="$parent"/>
+							</书社:recursive-dependency>
+						</if>
+						<if test="$files/@rdf:about[string()=string(current()/@xlink:href)]">
+							<书社:dependency>
+								<value-of select="@xlink:href"/>
+							</书社:dependency>
+						</if>
+					</for-each>
+				</for-each>
+			</for-each>
+		</variable>
+		<choose>
+			<when test="exsl:node-set($new)/书社:dependency">
+				<call-template name="书社:process-dependencies">
+					<with-param name="processed">
+						<copy-of select="$old"/>
+					</with-param>
+					<with-param name="unprocessed">
+						<copy-of select="$new"/>
+					</with-param>
+				</call-template>
+			</when>
+			<otherwise>
+				<copy-of select="$old"/>
+			</otherwise>
+		</choose>
+	</template>
+	<template match="rdf:RDF/nfo:LocalFileDataObject[not(nie:interpretedAs/nfo:Folder or nie:interpretedAs/nfo:PlainTextDocument)]" priority="1">
+		<copy>
+			<apply-templates select="@*|node()"/>
+			<if test="starts-with(@rdf:about, 'about:shushe?source=')">
+				<dct:hasFormat>
+					<nfo:LocalFileDataObject dct:creator="urn:fdc:ladys.computer:20231231:Shu1She4" nfo:fileName="{substring-after(@rdf:about, 'about:shushe?source=')}"/>
+				</dct:hasFormat>
+			</if>
+		</copy>
+	</template>
+	<template match="rdf:RDF/nfo:LocalFileDataObject[nie:interpretedAs/nfo:PlainTextDocument]" priority="1">
+		<variable name="parsed" select="document(concat($builddir, '/sources/', @nfo:fileName), .)"/>
+		<variable name="destination-delim" select="concat('/', $parsed/*/@书社:destination, '/')"/>
+		<variable name="destination">
+			<choose>
+				<when test="not(starts-with(@rdf:about, 'about:shushe?source='))"/>
+				<when test="not(contains($destination-delim, '//') or contains($destination-delim, '/./') or contains($destination-delim, '/../'))">
+					<value-of select="$parsed/*/@书社:destination"/>
+				</when>
+				<otherwise>
+					<value-of select="substring-after(@rdf:about, 'about:shushe?source=')"/>
+				</otherwise>
+			</choose>
+		</variable>
+		<variable name="dependencies-fragment">
+			<apply-templates select="." mode="书社:dependencies"/>
+		</variable>
+		<variable name="dependencies" select="exsl:node-set($dependencies)"/>
+		<copy>
+			<apply-templates select="@*|node()"/>
+			<for-each select="$dependencies/书社:dependency">
+				<书社vocab:hasDependencyOn rdf:resource="{.}"/>
+			</for-each>
+			<for-each select="$dependencies/书社:recursive-dependency">
+				<书社vocab:hasRecursiveDependencyOn rdf:resource="{.}"/>
+			</for-each>
+			<if test="$destination!=''">
+				<dct:hasFormat>
+					<nfo:LocalFileDataObject dct:creator="urn:fdc:ladys.computer:20231231:Shu1She4" nfo:fileName="{$destination}">
+					</nfo:LocalFileDataObject>
+				</dct:hasFormat>
+			</if>
+		</copy>
+	</template>
+	<template match="@*|node()">
+		<copy>
+			<apply-templates select="@*|node()"/>
+		</copy>
+	</template>
+	<template match="nfo:LocalFileDataObject" mode="书社:dependencies">
+		<if test="nie:interpretedAs/nfo:PlainTextDocument">
+			<call-template name="书社:process-dependencies">
+				<with-param name="unprocessed">
+					<书社:dependency-root>
+						<value-of select="@rdf:about"/>
+					</书社:dependency-root>
+				</with-param>
+			</call-template>
+		</if>
+	</template>
+</transform>
diff --git a/lib/metadata2dependencies.xslt b/lib/metadata2dependencies.xslt
index 4d08ba1..7bbd4fa 100644
--- a/lib/metadata2dependencies.xslt
+++ b/lib/metadata2dependencies.xslt
@@ -13,103 +13,23 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
 -->
 <transform
 	xmlns="http://www.w3.org/1999/XSL/Transform"
-	xmlns:dct="http://purl.org/dc/terms/"
-	xmlns:exsl="http://exslt.org/common"
 	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:xlink="http://www.w3.org/1999/xlink"
-	xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4"
+	xmlns:书社vocab="urn:fdc:ladys.computer:20231231:Shu1She4:vocab:"
 	version="1.0"
 >
-	<variable name="files" select="/rdf:RDF/nfo:LocalFileDataObject"/>
-	<template name="书社:process-dependencies">
-		<param name="processed"/>
-		<param name="unprocessed"/>
-		<variable name="queue">
-			<copy-of select="exsl:node-set($unprocessed)/书社:dependency-root"/>
-			<for-each select="exsl:node-set($unprocessed)/书社:dependency">
-				<if test="not((exsl:node-set($processed)/书社:*|preceding-sibling::书社:*|following-sibling::书社:recursive-dependency)[string()=string(current())])">
-					<copy-of select="."/>
-				</if>
-			</for-each>
-		</variable>
-		<variable name="old">
-			<copy-of select="exsl:node-set($processed)/书社:dependency-root"/>
-			<copy-of select="exsl:node-set($processed)/书社:recursive-dependency"/>
-			<for-each select="exsl:node-set($unprocessed)/书社:recursive-dependency">
-				<if test="not((exsl:node-set($processed)/书社:recursive-dependency|preceding-sibling::书社:recursive-dependency)[string()=string(current())])">
-					<copy-of select="."/>
-				</if>
-			</for-each>
-			<for-each select="exsl:node-set($processed)/书社:dependency">
-				<if test="not(exsl:node-set($unprocessed)/书社:recursive-dependency[string()=string(current())])">
-					<copy-of select="."/>
-				</if>
-			</for-each>
-			<copy-of select="$queue"/>
-		</variable>
-		<variable name="new">
-			<for-each select="exsl:node-set($queue)/书社:*">
-				<for-each select="$files[@rdf:about=string(current()) and nie:interpretedAs/nfo:PlainTextDocument and dct:hasFormat/*/nie:interpretedAs/*[@nie:mimeType='application/xml']]">
-					<variable name="parent" select="@rdf:about"/>
-					<for-each select="document(dct:hasFormat/*[nie:interpretedAs/*[@nie:mimeType='application/xml']]/@nfo:fileUrl[1])//书社:link[@xlink:show='embed']">
-						<if test="exsl:node-set($old)/书社:dependency-root[string()=string(current()/@xlink:href)]">
-							<书社:recursive-dependency>
-								<value-of select="$parent"/>
-							</书社:recursive-dependency>
-						</if>
-						<if test="$files/@rdf:about[string()=string(current()/@xlink:href)]">
-							<书社:dependency>
-								<value-of select="@xlink:href"/>
-							</书社:dependency>
-						</if>
-					</for-each>
-				</for-each>
-			</for-each>
-		</variable>
-		<choose>
-			<when test="exsl:node-set($new)/书社:dependency">
-				<call-template name="书社:process-dependencies">
-					<with-param name="processed">
-						<copy-of select="$old"/>
-					</with-param>
-					<with-param name="unprocessed">
-						<copy-of select="$new"/>
-					</with-param>
-				</call-template>
-			</when>
-			<otherwise>
-				<copy-of select="$old"/>
-			</otherwise>
-		</choose>
-	</template>
-	<template match="nfo:LocalFileDataObject" mode="书社:dependencies">
-		<if test="nie:interpretedAs/nfo:PlainTextDocument">
-			<call-template name="书社:process-dependencies">
-				<with-param name="unprocessed">
-					<书社:dependency-root>
-						<value-of select="@rdf:about"/>
-					</书社:dependency-root>
-				</with-param>
-			</call-template>
-		</if>
-	</template>
 	<template match="/">
-		<for-each select="$files[nie:interpretedAs/nfo:PlainTextDocument]">
-			<variable name="parent" select="@rdf:about"/>
-			<variable name="dependencies">
-				<apply-templates select="." mode="书社:dependencies"/>
-			</variable>
+		<for-each select="rdf:RDF/nfo:LocalFileDataObject[nie:interpretedAs/nfo:PlainTextDocument]">
 			<value-of select="@rdf:about"/>
 			<text>&#xA;</text>
-			<for-each select="exsl:node-set($dependencies)/书社:recursive-dependency">
+			<for-each select="书社vocab:hasRecursiveDependencyOn/@rdf:resource">
 				<text>&#x9;</text>
 				<text>-</text>
 				<value-of select="."/>
 				<text>&#xA;</text>
 			</for-each>
-			<for-each select="exsl:node-set($dependencies)/书社:dependency">
+			<for-each select="书社vocab:hasDependencyOn/@rdf:resource">
 				<text>&#x9;</text>
 				<value-of select="."/>
 				<text>&#xA;</text>
diff --git a/lib/metadata2destinations.xslt b/lib/metadata2destinations.xslt
index cf18945..e1fe1cd 100644
--- a/lib/metadata2destinations.xslt
+++ b/lib/metadata2destinations.xslt
@@ -14,38 +14,16 @@ If a copy of the M·P·L was not distributed with this file, You can obtain one
 <transform
 	xmlns="http://www.w3.org/1999/XSL/Transform"
 	xmlns:dct="http://purl.org/dc/terms/"
-	xmlns:exslstr="http://exslt.org/strings"
-	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:书社="urn:fdc:ladys.computer:20231231:Shu1She4"
-	extension-element-prefixes="exslstr"
 	version="1.0"
 >
 	<template match="/">
 		<for-each select="/rdf:RDF/nfo:LocalFileDataObject[starts-with(@rdf:about, 'about:shushe?source=')]">
-			<choose>
-				<when test="nie:interpretedAs/nfo:PlainTextDocument and dct:hasFormat/*/nie:interpretedAs/*[@nie:mimeType='application/xml']">
-					<variable name="destination" select="document(dct:hasFormat/*[nie:interpretedAs/*[@nie:mimeType='application/xml']]/@nfo:fileUrl[1])/*/@书社:destination"/>
-					<value-of select="@rdf:about"/>
-					<text>|</text>
-					<choose>
-						<when test="$destination">
-							<value-of select="$destination"/>
-						</when>
-						<otherwise>
-							<value-of select="substring-after(@rdf:about, 'about:shushe?source=')"/>
-						</otherwise>
-					</choose>
-					<text>&#xA;</text>
-				</when>
-				<otherwise>
-					<value-of select="@rdf:about"/>
-					<text>|</text>
-					<value-of select="substring-after(@rdf:about, 'about:shushe?source=')"/>
-					<text>&#xA;</text>
-				</otherwise>
-			</choose>
+			<value-of select="@rdf:about"/>
+			<text>|</text>
+			<value-of select="dct:hasFormat/nfo:LocalFileDataObject[@dct:creator='urn:fdc:ladys.computer:20231231:Shu1She4']/@nfo:fileName"/>
+			<text>&#xA;</text>
 		</for-each>
 	</template>
 	<output method="text" encoding="UTF-8"/>