NSXMLDocument objectByApplyingXSLT с XSL Включить - PullRequest
3 голосов
/ 20 апреля 2010

У меня возникают некоторые проблемы с XSL-обработкой, когда существуют таблицы стилей, которые включают относительно другие таблицы стилей.

(XML-файлы могут быть неактуальными, но для полноты включены - код внизу).

С учетом XML-файла:

<?xml version="1.0" ?>
<famous-persons>
<persons category="medicine">
  <person>
   <firstname> Edward   </firstname>
   <name>      Jenner   </name>
  </person>
</persons>
</famous-persons>

и XSL-файл:

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
  <xsl:include href="included.xsl" />
</xsl:stylesheet>

ссылка на эту таблицу стилей в том же каталоге с именем includes.xsl:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"> 
  <xsl:template match="/">
     <html><head><title>Sorting example</title></head><body>
    </body></html>
  </xsl:template>
</xsl:stylesheet>

как мне сделать так, чтобы следующий фрагмент кода:

NSError *lError = nil;
NSXMLDocument *lDocument = [ [ NSXMLDocument alloc ] initWithContentsOfURL:
                                        [ NSURL URLWithString: @"file:///pathto/data.xml" ]
                                    options: 0
                                    error: &lError ];

NSXMLDocument *lResult = [ lDocument objectByApplyingXSLTAtURL: [ NSURL URLWithString: @"file:///pathto/style.xsl" ]
                                    arguments: nil
                                    error: nil ];

не дает мне ошибку:

I/O warning : failed to load external entity "included.xsl"
compilation error: element include
xsl:include : unable to load included.xsl

Я пробовал всевозможные варианты. Также загрузка XML-документов с помощью NSXMLDocumentXInclude заранее не помогает. Указание абсолютного пути к включаемому файлу XSL работает безупречно.

Есть ли способ выполнить обработку XSL, чтобы таблица стилей могла включать другую таблицу стилей в свой локальный путь?

1 Ответ

1 голос
/ 22 февраля 2012

У меня тоже была эта проблема. В конце я написал класс SWXSLTransform, который включен в мою структуру SWXMLMapping: https://github.com/oriontransfer/SWXMLMapping

Основная проблема заключается в том, что -[NSXMLDocument objectByApplyingXSLTAtURL:...] фактически не передает URL-адрес libxslt. Вместо этого он загружает данные, указывающие на этот URL, и передает данные в libxslt без какого-либо базового URI. Из-за этого текущий рабочий каталог становится базовым URI - вы можете использовать <xsl:include href="...">, где href относительно текущего рабочего каталога ... Не очень полезно!

Насколько я могу судить, интерфейс NSXMLDocument полностью поврежден, и, кажется, нет никакого способа исправить это. Я отправил отчет об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...