/ / XSLT 1.0 поколение на директория - perl, xslt, xslt-1.0, exslt

XSLT 1.0 генериране на директория - perl, xslt, xslt-1.0, exslt

Има ли някакво съоръжение в XSLT 1.0 или exslt, за да генерирате документ за резултат, така че той също създава директорията (ите) в пътя, ако те не присъстват? Или трябва да създам директорията отделно, преди да генерирам изходния документ?

UPDATE

Използвам Perl, за да извърша трансформацията на XSLT 1.0. Ето кода, който използвам.

#!/usr/local/bin/perl -w

use strict;
use warnings;
use File::Path;
use File::Spec;
use File::Basename;
use XML::LibXSLT;
use XML::LibXML;

my $isfile;

my ($xmlfile,$xsltfile,$samplefile) = qw/ Example.xml trans.xsl sample.xml/;

if(-f $samplefile)
{
$isfile = "true";
print "File is presentn";
}
else
{
$isfile = "false";
print "File is absentn";
}

my %args = ( "isfile" => $isfile );
my $xslt = XML::LibXSLT->new;
my $stylesheet = $xslt->parse_stylesheet_file($xsltfile);
my $results    = $stylesheet->transform_file($xmlfile,XML::LibXSLT::xpath_to_string(%{args}));

0;

И моят XSL файл е както следва

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xslt"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" media-type="text/xml"/>

<xsl:param name="isfile"/>

<xsl:template match="/">
<xsl:if test="$isfile = "true"">
<exsl:document href = "/home/USER/Documents/XSLT/Dir1/Dir2/Dir3/outputfile1.xml" method="xml" version="1.0" encoding="utf-8" indent="yes">
Article:- <xsl:value-of select="/Article/Title"/>
Authors:- <xsl:apply-templates select="/Article/Authors/Author"/>
</exsl:document>
</xsl:if>
</xsl:template>

<xsl:template match="Author">
<exsl:document href = "outputfile2.xml" method="xml" version="1.0" encoding="utf-8" indent="yes">
always Generate this output!! <xsl:value-of select="." />
</exsl:document>
</xsl:template>
</xsl:stylesheet>

Получавам следните грешки.

runtime error: file trans.xsl line 24 element document
Directory creation for /home/USER/Documents/XSLT/Dir1/Dir2/Dir3/outputfile1.xml refused
runtime error: file trans.xsl line 24 element document
xsltDocumentElem: write rights for /home/USER/Documents/XSLT/Dir1/Dir2/Dir3/outputfile1.xml denied
at Transform.pl line 29

Дори когато сменя пътя като Dir1/Dir2/Dir3/outputfile1.xml (така че да използва текущата директория, където съм дал пълни разрешения), във файла xsl получавам следните грешки.

runtime error: file trans.xsl line 24 element document
Directory creation for Dir1/Dir2/Dir3/outputfile1.xml refused
runtime error: file trans.xsl line 24 element document
xsltDocumentElem: write rights for Dir1/Dir2/Dir3/outputfile1.xml denied
at Transform.pl line 29

Дали libxslt в Perl 5.8.8 не поддържа създаването на директория?

Отговори:

1 за отговор № 1

опитах

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
exclude-result-prefixes="xs exsl"
version="1.0">

<xsl:template match="/">
<exsl:document href="outputTest1/test2016082403Result.xml">
<foo>bar</foo>
</exsl:document>
</xsl:template>

</xsl:stylesheet>

с xsltproc, както е предоставено с oXygen и директорията outputTest1 е създаден и съдържа файла test2016082403Result.xml така че поне с xsltproc / libxslt създаването на директория изглежда се поддържа. Не съм запознат с който и да е друг поддържащ XSLT 1.0 процесор exsl:document така или иначе.


1 за отговор № 2

Да, човек може да напише / прочете файл и да създаде директорияв XSLT 1.0, ако използвате Perl за задействане на трансформацията. Както спомена Мартин Хонен, всичко, което трябваше да направя, беше да добавя няколко обратни извиквания за сигурност, така че всички XSLT двигател да изпълнява файловите операции. Сега изглежда така скриптът на Perl

#!/usr/local/bin/perl -w

use strict;
use warnings;
use File::Path;
use File::Spec;
use File::Basename;
use XML::LibXSLT;
use XML::LibXML;

my $isfile;

my ($xmlfile,$xsltfile,$samplefile) = qw/ Example.xml trans.xsl sample.xml/;

if(-f $samplefile)
{
$isfile = "true";
print "File is presentn";
}
else
{
$isfile = "false";
print "File is absentn";
}

my %args = ( "isfile" => $isfile );
my $xslt = XML::LibXSLT->new;
my $stylesheet = $xslt->parse_stylesheet_file($xsltfile);

my $security = XML::LibXSLT::Security->new();
$security->register_callback( read_file  => sub { return 1;} );
$security->register_callback( write_file => sub { return 1;} );
$security->register_callback( create_dir => sub { return 1;} );
$stylesheet->security_callbacks( $security );

my $results    = $stylesheet->transform_file($xmlfile,XML::LibXSLT::xpath_to_string(%{args}));

0;