2017-02-11 2 views
0

Мой Swift приложение производит XMLDocument, который затем преобразуется с помощью XSLT:Как обрабатывать XMLDocument с помощью EXSLT или XSL 2 в Swift?

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

В моей таблицы стилей XSLT (xsltString), я хотел бы получить доступ к результирующих фрагментов дерева с использованием XPath. Это не поддерживается в XSLT 1.0; Я пробовал использовать XSLT 2.0, но Swift не поддерживает его; указав version="2.0" в xsl:stylesheet элемент производит эту ошибку:

xsl:version: only 1.0 features are supported 


Я думаю, что я мог бы использовать node-set из EXSLT. Я не знаком с этим, но я попытался добавить информацию об EXSLT в элемент xsl:stylesheet. Это, кажется, не имеют никакого эффекта:

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

я получаю следующие ошибки:

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


Можно ли использовать XSL 2,0 или EXSLT в моей ситуации, и как?

+0

Рассмотрим, чтобы показать нам минимальный, но полный образец вы пробовали. Весьма необычно, что процессор XSLT 1.0 не поддерживает поддержку 'exsl: node-set' или аналогичную функцию в проприетарном пространстве имен. Итак, узнайте, какой XSLT-процессор Swift использует и, надеюсь, способ конвертировать фрагмент результирующего дерева в набор узлов. –

+1

Попробуйте запустить простой тестовый пример, например таблицу стилей, на http://xsltransform.net/3NSSEvF, на ваш процессор. –

+0

Спасибо. Используя таблицу стилей, с которой вы связались, я увидел, что Swift использует libxslt. Однако я не смог продолжить: я попытался префикс 'node-set' с' libxslt: ',' ​​xt: 'и' saxon: ', как описано [здесь] (http://xmlsoft.org/XSLT /html/libxslt-extra.html#xsltFunctionNodeSet), но всегда получайте ту же ошибку: 'xmlXPathCompOpEval: function node-set not found'. –

ответ

0

Предложения Martin Honnen привели меня к рассмотрению использования xsltproc вместо использования метода Swift's object(byApplyingXSLTString:arguments:).

Вот как выглядит результат.

Swift код

// 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> 
Смежные вопросы