I am a very beginner in XSLT world, so thank you in advance for your understanding. I have a document target.xml as a main input for the transformation, and the document includes subscribers:
<subscription-table>
<subscriber name="aries" useZipXfer="yes" usePubMed="no">
<ftp server="dummy.url1.com" port="21" remotedir="/XXXXXXX" userid="XXXXXXX" password="XXXXXXXXX" binary="yes" passive="no"/>
<notify-success>
<mail mailhost="smtprelayptc1.test.net" mailport="25" subject="MRCS-PS HEADER UPDATE - PAP">
<from address="success1.from@mail.com"/>
<to address="success1.to@mail.com"/>
</mail>
</notify-success>
<notify-failure>
<mail mailhost="smtprelayptc1.test.net" mailport="25" subject="MRCS-PS HEADER UPDATE - PAP">
<from address="failure1.from@mail.com"/>
<to address="failure1.to@mail.com"/>
</mail>
</notify-failure>
</subscriber>
<subscriber name="cas" useZipXfer="no" usePubMed="yes" sendPromote="no">
<ftp server="dummy.url2.com" port="21" remotedir="/YYYYYYY" userid="YYYYYYY" password="YYYYYYYYY" binary="yes" passive="no"/>
<notify-success>
<mail mailhost="smtprelayptc1.test.net" mailport="25" subject="MRCS-PS HEADER UPDATE - PAP">
<from address="success2.from@mail.com"/>
<to address="success2.to@mail.com"/>
</mail>
</notify-success>
<notify-failure>
<mail mailhost="smtprelayptc1.test.net" mailport="25" subject="MRCS-PS HEADER UPDATE - PAP">
<from address="failure2.from@mail.com"/>
<to address="failure2.to@mail.com"/>
</mail>
</notify-failure>
</subscriber>
</subscription-table>
For each subscriber in the target.xml file, I have a separate document with subscriber name. For example, I have aries_subscriptions.xml, cas_subscriptions.xml. In each subscriptions file, I have data for journals. For example, in aries_subscriptions.xml I have:
<subscription>
<database status="update" name="ovftdb">
<journal status="*" name="00002030" >
<issue status="new" pubdate="01/01/2004" name="*" an="99999999-999999999-99999" >
<header/>
</issue>
</journal>
<journal status="*" name="00000374" >
<issue status="new" pubdate="01/01/2004" name="*" an="99999999-999999999-99999" >
<header/>
</issue>
</journal>
<journal status="*" name="00000372" >
<issue status="new" pubdate="01/01/2004" name="*" an="99999999-999999999-99999" >
<header/>
</issue>
</journal>
...
I need to use target.xml as input for the transformation, and for each subscriber there open its file, find its journals, and take their name and pubdate attributes. For example, for "aries" subscriber, I need to open aries_subscriptions.xml, and take journal name and pubdate. Finally, for all subscribers, I need to generate lookup.xml file:
<journals xmlns:xlink="http://www.w3.org/1999/xlink">
<journal name="12345678">
<target identifier="aries" pubdate="01/01/2006">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='subscriberId1'])"/>
</target>
<target identifier="subscriberId2" pubdate="01/01/2006">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='subscriberId2'])"/>
</target>
</journal>
<journal name="23456781">
<target identifier="cas" pubdate="01/01/2006">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='subscriberId2'])"/>
</target>
<target identifier="subscriberId2" pubdate="01/01/2006">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='subscriberId3'])"/>
</target>
</journal>
</journals>
My xslt is:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="xs xsl saxon xlink">
<xsl:strip-space elements="*" />
<xsl:output method="xml" omit-xml-declaration="no"
indent="yes" encoding="UTF-8" saxon:character-representation="entity" />
<xsl:include href="utilities.xsl" />
<xsl:variable name="inputFolderAndFile">
<xsl:call-template
name="getValuesBeforeAndAfterLastOccurance">
<xsl:with-param name="inputString"
select="string(base-uri(.))" />
<xsl:with-param name="char" select="'/'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="inputFolderPath"
select="substring-before($inputFolderAndFile, '*')" />
<xsl:variable name="inputFile"
select="substring-after($inputFolderAndFile, '*')" />
<xsl:variable name="tokens"
select="tokenize($inputFile,'\.')" />
<xsl:variable name="baseFileName"
select="string-join($tokens[not(.=$tokens[last()])], '.')" />
<xsl:template match="@* | * | comment() | processing-instruction()">
<xsl:apply-templates select="@* | node()" />
</xsl:template>
<xsl:template match="text()">
<xsl:copy/>
</xsl:template>
<!-- <xsl:template match="text()" mode="journal-processing"/> -->
<xsl:template match="subscriber">
<xsl:variable name="subscriberName" select="document(concat($inputFolderPath, '/', @name,'_subscriptions.xml'))" />
<xsl:value-of select="$subscriberName" />
<xsl:apply-templates mode="journal-processing"/>
</xsl:template>
<xsl:template match="journal" mode="journal-processing">
<xsl:variable name="journalName" select="@name" />
<xsl:variable name="journalPubDate" select="issue/@pubdate" />
<xsl:variable name="subscriberNameFromDoc" select="substring-before('.', '_subscriptions')" />
<xsl:element name="journal">
<xsl:attribute name="name" select="$journalName"/>
<xsl:element name="target">
<xsl:attribute name="identifier" select="$subscriberNameFromDoc"/>
<xsl:attribute name="pubdate" select="$journalPubDate"/>
<xsl:element name="targetLink">
<xsl:attribute name="xlink">http://www.w3.org/1999/xlink</xsl:attribute>
<xsl:attribute name="xlink:href">$baseFileName#xpointer(/descendant::subscriber[attribute::name='$subscriberName'])</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
But, unfortunately, I got only empty xml document as a result. Could you please help me with the issue? Thank you in advance for any help.
When I applied Martin's comment, my code worked. So, please take a look at the solution:
<xsl:template match="subscriber">
<xsl:variable name="subscriberName" select="document(concat($inputFolderPath, '/', @name,'_subscriptions.xml'))" />
<xsl:apply-templates select="$subscriberName" mode="journal-processing"/>
</xsl:template>