2013-11-27 5 views
5

Я хотел бы проверить в XSLT, существует ли файл HTML или нет. Как я могу это сделать? Я уже пробовал файл-exist.xsl отсюда https://gist.github.com/emth/4531924, но он не работает для меня. Я пытался запустить его более 2 часов, но я застрял. Вот мой муравей сниппет:Как проверить наличие файла в XSLT?

<target name="transform"> 
    <xslt in="/tmp/sample.xml" out="/tmp/out.html" style="/tmp/sample.xsl" /> 
</target> 

и это мой XSLT-файл:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:java="http://www.java.com/"> 
<xsl:import href="file-exists.xsl"/> 
...  
<xsl:if test="java:file-exists('myfile.html', base-uri())"> 
    <!-- do something here... --> 
</xsl:if> 
.... 

Запуск этого с муравей я получаю следующее сообщение об ошибке:

[xslt] Processing /tmp/sample.xml to /tmp/out.html 
[xslt] Loading stylesheet /tmp/sample.xsl 
[xslt] : Error! The first argument to the non-static Java function 'fileExists' is not a valid object reference. 
[xslt] : Error! Cannot convert data-type 'void' to 'boolean'. 
[xslt] : Fatal Error! Could not compile stylesheet 
[xslt] Failed to process /tmp/sample.xml 

Может кто-нибудь дает мне пример, или есть ли другая альтернатива? Благодаря!

+0

Я думаю, что библиотека файлов exists.xsl использование XSL Engin 2.0, но вы запустите его в версии 1.0 http://stackoverflow.com/questions/2917655/how-do-i-check-for-the-existence-of-an-external-file-with-xsl – Sawyer

+0

Не имеет значения, пользуюсь ли я версией 1.0 или 2.0 , Я получаю ту же ошибку с 2.0 – user1613270

ответ

5

Я нашел решение:

<xsl:when test="fs:exists(fs:new('myfile.html'))" xmlns:fs="java.io.File"> 
    <!-- do something here... --> 
</xsl:when> 

и он работает независимо от XSLT 1.0 или 2.0

+0

Очень хороший отзыв. с только стандартным java api. –

+0

К сожалению, прямые вызовы Java не работают с Saxon 9 HE. – Hraban

3

Если файл представляет собой текстовый файл, вы можете использовать функцию XSLT 2.0:

fn:func-unparsed-text-available()

ФН: неанализируемые полнотекстового доступный функция определяет, является ли вызов на Fn: неанализируемые-текст функции с одинаковыми аргументами вернет строку. Функция попытается прочитать ресурс, идентифицированный URI, и проверить, что он правильно закодирован и не содержит недопустимых символов.

Это похоже на fn:doc-available(), который работает вместо документов XML.

+0

Это на самом деле документ HTML, который мне нужно проверить на наличие – user1613270

+0

Да. Это будет работать. Поэтому используйте 'fn: func-unparsed-text-available()'. –

+0

К сожалению, это не работает для меня? Я получаю ошибки: Ошибка! Ошибка проверки типа выражения funcall (func-unparsed-text-available, [literal-expr (myfile.html)]). Неустранимая ошибка! Не удалось скомпилировать таблицу стилей – user1613270

Смежные вопросы