2017-02-11 2 views
0

マイスウィフトアプリケーションは、それがその後、XSLTを使用して変換したXMLDocument、生成します。私のXSLTスタイルシート(xsltString)でSwiftでEXSLTまたはXSL 2を使用してXMLDocumentを処理する方法は?

xmlDocument.object(byApplyingXSLTString: xsltString, arguments: nil) 

を、私は、XPathを使用して結果ツリーフラグメントにアクセスしたいと思います。これはXSLT 1.0ではサポートされていません。私はXSLT 2.0を使ってみましたが、それはSwiftによってサポートされていないようです。 xsl:stylesheet要素でversion="2.0"を指定すると、このエラーが発生します。

xsl:version: only 1.0 features are supported 


私はEXSLTからnode-setを使用することができると思います。私はこれに慣れていませんが、EXSLTに関する情報をxsl:stylesheet要素に追加しようとしました。

xmlXPathCompOpEval: function node-set not found 
XPath error : Unregistered function 


それは私の状況でXSL 2.0またはEXSLTを使用することが可能であり、そしてどのように:私は次のエラーを取得

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl" 
    version="1.0"> 

:これは効果がないように見えますか?

+0

は私たちにあなたが試してみましたが、最低限の完全なサンプルを表示するように考えてみましょう。 XSLT 1.0プロセッサが、独自の名前空間で 'exsl:node-set'または同様の機能をサポートしていないことは、まれです。どのXSLTプロセッサーSwiftが使用されているかを調べ、結果のツリーフラグメントをノードセットに変換する方法があることを願っています。 –

+1

http://xsltransform.net/3NSSEvFのスタイルシートのような簡単なテストケースをプロセッサに実行してみてください。 –

+0

ありがとうございます。リンクしたスタイルシートを使って、私はSwiftがlibxsltを使っているのを見ました。しかし、私はさらに進めませんでした。私は 'node-set'に' libxslt: '、' xt: 'と' saxon: 'と接頭辞をつけてみました。[here](http://xmlsoft.org/XSLT) /html/libxslt-extra.html#xsltFunctionNodeSet)でも、常に同じエラーが発生します: 'xmlXPathCompOpEval:function node-set not found'。 –

答えて

0

Martin Honnenの提案により、Swiftのobject(byApplyingXSLTString:arguments:)メソッドを使用するのではなく、xsltprocの使用を検討するようになりました。

結果は次のようになります。

スウィフトコード

// Write XML to temporary file 
xmlDocument.xmlString.write(to: temporaryXMLFileURL, atomically: false, encoding: String.Encoding.utf8) 

// Use xsltproc to apply the XSLT transformation 
let task = Process() 
task.launchPath = "/usr/bin/xsltproc" 
task.arguments = try [xsltFileURL.absoluteString, temporaryXMLFileURL.absoluteString] 
let pipe = Pipe() 
task.standardOutput = pipe 
task.launch() 
let data = pipe.fileHandleForReading.readDataToEndOfFile() 
let xsltResult = String(data: data, encoding: .utf8)! 

XSLTコード

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exslt="http://exslt.org/common" 
    extension-element-prefixes="exslt" 
    version="1.0"> 

    <xsl:variable name="stuff"> 
     ... 
    </xsl:variable> 

    <xsl:for-each select="exslt:node-set($stuff)/stuff"> 
     ... 
    </xsl:for-each> 

</xsl:stylesheet> 
関連する問題