XSLT 1.0 生成一个目录

XSLT 1.0 generation of a directory

XSLT 1.0 或 exslt 中是否有任何工具可用于生成结果文档,以便它也可以在路径中创建目录(如果它们不存在)?或者我是否必须在生成输出文档之前单独创建目录?

更新

我正在使用 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 present\n";
}
else
{
    $isfile = "false";
    print "File is absent\n";
}

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

Perl 5.8.8 中的libxslt 是否不支持创建目录?

我试过了

<?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>

使用 oXygen 提供的 xsltproc 和目录 outputTest1 创建并包含文件 test2016082403Result.xml 因此至少 xsltproc/libxslt 似乎支持目录创建。我不知道任何其他支持 exsl:document 的 XSLT 1.0 处理器。

是的,如果您使用 Perl 触发转换,可以 write/read 在 XSLT 1.0 中创建文件和目录。正如 Martin Honnen 所提到的,我所要做的就是添加一些安全回调,以便所有 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 present\n";
}
else
{
    $isfile = "false";
    print "File is absent\n";
}

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;