2016-08-24 119 views
-1

在XSLT 1.0中是否有任何可用的工具或exslt來生成結果文檔,以便它在路徑中創建目錄(如果它們不存在)?還是必須在生成輸出文檔之前單獨創建目錄?XSLT 1.0代目錄

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 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不支持創建目錄嗎?

+0

考慮爲Perl添加一個標記以獲取Perl和libxslt的特定幫助。我不確定很多在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

我試圖

<?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的是提供氧氣和目錄outputTest1創建幷包含在文件test2016082403Result.xml與xsltproc的所以至少/對的libxslt目錄創建似乎得到支持。我不知道支持exsl:document的任何其他XSLT 1.0處理器。