带有XSL Include的NSXMLDocument objectByApplyingXSLT

时间:2010-04-19 21:13:19

标签: xml cocoa xslt

当存在相对包含其他样式表的样式表时,我遇到了一些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>

在名为included.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

我一直在尝试各种各样的选择。同时使用NSXMLDocumentXInclude加载XML文档似乎没有帮助。指定要包含的XSL文件的绝对路径可以完美地工作。

有没有办法进行XSL处理,以便样式表可以在其本地路径中包含另一个样式表?

1 个答案:

答案 0 :(得分:1)

我也有这个问题。最后,我编写了SWXSLTransform类,该类包含在我的SWXMLMapping框架中:https://github.com/oriontransfer/SWXMLMapping

主要问题是,-[NSXMLDocument objectByApplyingXSLTAtURL:...]实际上没有将网址传递给libxslt。相反,它会加载指向该URL的数据,并将数据提供给libxslt,而不需要任何基本URI。因此,当前工作目录成为基本URI - 您可以使用<xsl:include href="...">其中href相对于当前工作目录...不是很有用!

据我所知,NSXMLDocument界面完全坏了,似乎没有办法解决它。我已经提交了一份错误报告。