2016-08-24 10 views
-1

結果ドキュメントを生成するためにXSLT 1.0またはexsltで利用できる機能が存在するため、存在しない場合はパスにディレクトリも作成されますか?または、出力ドキュメントを生成する前に別にディレクトリを作成する必要がありますか?XSLT 1.0ディレクトリの生成

UPDATE

私は、XSLT 1.0変換を実行するための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 $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> 

私は次のエラーを取得するには、次の通りです。私はDir1/Dir2/Dir3/outputfile1.xmlとしてパスを変更しても

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 

(それは私がすべての権限を与えている現在のディレクトリを使用するように)、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はディレクトリ作成をサポートしていませんか?

+0

Perlとlibxsltに固有のヘルプを得るためにPerl用のタグを追加することを検討してください。私は、XSLTがスタイルシートを実行するためにPerlを使用することについての質問を読んでいる読者の多くが確信していません。 –

+0

質問が更新されました。 – Recker

+1

http://search.cpan.org/dist/XML-LibXSLT/LibXSLT.pmには、「XML :: LibXSLT :: Security」のセクションに記載されています。「デフォルトでは、create_dirは許可されていません。登録されました。 '1'を返すコールバックを設定することで明示的に許可する必要があるかのように見えます。 –

答えて

1

はい、変換を開始するためにPerlを使用している場合は、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; 
1

私はそう少なくともxsltprocのと/ディレクトリの作成をlibxsltはサポートされているようだ酸素で提供してディレクトリoutputTest1を作成したとして、xsltprocのと

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

を試してみましたが、ファイルtest2016082403Result.xmlを含んでいました。とにかくexsl:documentをサポートしている他のXSLT 1.0プロセッサについては気づいていません。