С XSL-FO я хочу опубликовать динамические ссылки на файл PDF. Я нашел здесь на StackOverflow и с Google много примеров со статическим url, но нет примера с динамическим url. Вот почему я отправляю этот вопрос. Я хочу, чтобы создать ссылку из файла XML (ссылка значение атрибута «HREF» в «topicref» элемента):Публикация динамической ссылки в PDF-файле из XML-файла с помощью XSL-FO (Apache FOP)
<?xml version="1.0" encoding="utf-8"?>
<map outputclass="DTVMap">
<title>Testdocument DTVmap</title>
<topicref format="dita" scope="local" href="ObjSt/bla/DTV/Testdocument_14.06.dita" navtitle="Testdocument 14.06" />
</map>
я использовал в XSL-FO:
<fo:basic-link external-destination="url(<xsl:value-of select="map/topicref/@href"/>)" color="blue" text-
decoration="underline"><xsl:value-of select="map/topicref/@href"/></fo:basic-link>
И получаю сообщение, что: «Значение атрибута« external-destination », связанное с типом элемента« null », не должно содержать символ« < ».
Я попытался получить ссылку с добавлением кода ниже в xsl-fo вместо «базового-внешнего-назначения» сверху.
<xsl:value-of select="map/topicref/@href"/>
<xsl:param name="link" select="map/topicref/@href" />
<fo:basic-link color="blue" text-decoration="underline">
<xsl:attribute name="external-destination">
<xsl:value-of select="$link" />
</xsl:attribute>
<xsl:value-of select="$link" />
</fo:basic-link>
Существует связь в генерируемый PDF сейчас, но ссылка: «Файл: ///C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument_14.06.dita» в смену: 'ObjSt/л/DTV/Testdocument_14.06.dita.
Вопрос в том, как я могу получить ссылку вроде: 'ObjSt/bla/DTV/Testdocument 14.06.dita' так, без 'файла: /// C/ws/fo_xslt'? 'C:/ws/fo_xslt' - это каталог, в который я помещал сгенерированный PDF-файл. Или: Как я могу получить ссылку, которая содержит только значение атрибута href? Благодаря
PS: Класс Java я использую для того, чтобы сгенерировать PDF это (просто чтобы дать немного больше фона):
package foXslt;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.fop.apps.*;
public class FopPdf {
public static void main(String[] args) {
FopPdf fOPPdfDemo = new FopPdf();
try {
fOPPdfDemo.convertToPDF();
} catch (FOPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Method that will convert the given XML to PDF
* @throws IOException
* @throws FOPException
* @throws TransformerException
*/
public void convertToPDF() throws IOException, FOPException, TransformerException {
// the XSL FO file
File xsltFile = new File("C:\\ws\\fo_xslt\\foxslt.xsl");
// the XML file which provides the input
StreamSource xmlSource = new StreamSource(new File("C:\\ws\\fo_xslt\\xmlDTVMapMetLink.xml"));
// create an instance of fop factory
FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
// a user agent is needed for transformation
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
// Setup output
OutputStream out;
out = new java.io.FileOutputStream("C:\\ws\\fo_xslt\\foxslt.pdf");
try {
// Construct fop with desired output format
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, out);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xsltFile));
// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());
// Start XSLT transformation and FOP processing
// That's where the XML is first transformed to XSL-FO and then
// PDF is created
transformer.transform(xmlSource, res);
} finally {
out.close();
}
}
Как вы подтвердили, что сгенерированная ссылка «file: ///C/ws/fo_xslt/ObjSt/bla/DTV/Testdocument_14.06.dita»? Результат отображения Adobe Reader? Я думаю, что Reader обычно распознает относительный путь, основанный на существующей папке PDF. – tmakita
'ObjSt/bla/DTV/Testdocument 14.06.dita' - относительная запись пути. Какой абсолютный путь вы хотите создать из этого? – tmakita