3

Ruby/NokogiriのXSLTに基づいてXMLを変換しようとしています。

doc   = Nokogiri::XML(File.read('some_file.xml'))
xslt  = Nokogiri::XSLT(File.read('some_transformer.xslt'))

puts xslt.transform(doc)

しかし失敗します:

I / O警告:外部エンティティ「dateDifference.xsl」のロードに失敗しました

RuntimeError:コンパイルエラー:要素スタイルシート

xsl:exclude-result-prefixes:未定義の名前空間exslコンパイル

エラー:要素のインポートxsl:import:dateDifference.xslをロードできません

おそらく、some_transform.xsltファイルで外部エンティティを使用していることが原因です。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:res="rate.fidelio.6.0" xmlns:inv="rtav.fidelio.4.0" xmlns:aravr="ravr.fidelio.2.0" xmlns:aravl="ravl.fidelio.2.0"  xmlns:exslt="http://exslt.org/common" xmlns:date="http://exslt.org/dates-and-times" exclude-result-prefixes="res inv aravr aravl date exsl">    
 <xsl:import href="dateDifference.xsl" />
 ...
 </xsl:stylesheet>

それを修正する方法はありますか?

4

1 に答える 1

1
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:res="rate.fidelio.6.0" 
xmlns:inv="rtav.fidelio.4.0" 
xmlns:aravr="ravr.fidelio.2.0" 
xmlns:aravl="ravl.fidelio.2.0"  
xmlns:exslt="http://exslt.org/common" 
xmlns:date="http://exslt.org/dates-and-times" 
exclude-result-prefixes="res inv aravr aravl date exsl">

エラーは、エラーメッセージとまったく同じです。

XSLTプロセッサは、"exsl"名前空間プレフィックスが宣言されていないと文句を言いますが、exclude-result-prefixes属性にリストされています。

これを次のように修正します

exclude-result-prefixes="res inv aravr aravl date exslt"

2番目の問題の場合

エラー:要素のインポートxsl:import:dateDifference.xslをロードできません

このメッセージはdateDifference.xsl、現在のXSLTファイルが存在する同じディレクトリに名前の付いたファイルがないことを意味します(またはファイルは存在しますが構文的に無効であるか、ファイルにアクセスするにはアクセス許可が必要です...または... )。

于 2012-09-06T11:54:31.847 に答える