diff --git a/resources/xproc/fulltext/prepare-mets.xsl b/resources/xproc/fulltext/prepare-mets.xsl index 5ccd3d1457771783f2a5bcbb2e89101950dd85b8..542cbcacf4502384968d14794d3193e3a5bbc049 100644 --- a/resources/xproc/fulltext/prepare-mets.xsl +++ b/resources/xproc/fulltext/prepare-mets.xsl @@ -1,21 +1,39 @@ <xsl:transform version="2.0" + exclude-result-prefixes="#all" xmlns:mets="http://www.loc.gov/METS/" + xmlns:fun="http://selbstzeugnisse.hab.de/ns" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + <xsl:param name="target" select="'html'"/> + + <xsl:output method="xml" indent="yes"/> + <xsl:template match="mets:mets"> <transformations> - <xsl:for-each select="//mets:div[ancestor-or-self::mets:div/@ID = //mets:behaviorSec[@ID = 'html']/mets:behavior/@STRUCTID][mets:fptr]"> - <xsl:variable name="metsId" select="@ID"/> - <xsl:variable name="fileId" select="mets:fptr/@FILEID"/> - <xsl:if test="//mets:file[@ID = $fileId][@MIMETYPE = 'application/tei+xml'] and $metsId != 'home'"> - <xsl:variable name="metsIds" select="ancestor-or-self::mets:div[@ID = //mets:behaviorSec[@ID = 'html']/mets:behavior/@STRUCTID]/@ID"/> - <transformation id="{@ID}" - source="{//mets:file[@ID = $fileId][@MIMETYPE = 'application/tei+xml']/mets:FLocat/@xlink:href}" - stylesheet="{(//mets:behaviorSec[@ID = 'html']/mets:behavior[@STRUCTID = $metsIds])[1]/mets:mechanism/@xlink:href}"/> + <xsl:for-each select="//mets:div[@ID and @ID != 'home']"> + <xsl:if test="//mets:file[@ID = current()/mets:fptr/@FILEID]/@MIMETYPE = 'application/tei+xml'"> + <xsl:variable name="candidates" select="//mets:behaviorSec[@ID = $target]//mets:behavior[mets:interfaceDef/@xlink:href = 'http://www.w3.org/TR/xslt']"/> + <xsl:variable name="behavior" select="fun:select-behavior(reverse(ancestor-or-self::mets:div), $candidates)"/> + <xsl:if test="$behavior"> + <transformation id="{@ID}" stylesheet="{$behavior/mets:mechanism/@xlink:href}" source="{//mets:file[@ID = current()/mets:fptr/@FILEID]/mets:FLocat/@xlink:href}"/> + </xsl:if> </xsl:if> </xsl:for-each> </transformations> </xsl:template> + <xsl:function name="fun:select-behavior" as="element(mets:behavior)?"> + <xsl:param name="divisions" as="element(mets:div)+"/> + <xsl:param name="behaviors" as="element(mets:behavior)*"/> + <xsl:choose> + <xsl:when test="$divisions[1]/@ID = $behaviors/@STRUCTID"> + <xsl:sequence select="$behaviors[@STRUCTID = $divisions[1]/@ID][1]"/> + </xsl:when> + <xsl:when test="count($divisions) gt 1"> + <xsl:sequence select="fun:select-behavior($divisions[position() gt 1], $behaviors)"/> + </xsl:when> + </xsl:choose> + </xsl:function> + </xsl:transform>