天线屋 XSL-FO 扩展不工作?
Posted
技术标签:
【中文标题】天线屋 XSL-FO 扩展不工作?【英文标题】:Antenna House XSL-FO Extensions not working? 【发布时间】:2011-05-01 13:47:27 【问题描述】:任何尝试通过指向其命名空间来使用 Antenna House 的 xsl-fo 扩展(这会给出“找不到页面”顺便说一句)都会导致错误:
命名空间“http://www.w3.org/1999/XSL/Format”中的元素“root”在命名空间“http://www.antennahouse.com/names”中具有无效的子元素“document-info” /XSL/扩展”。预期的可能元素列表:命名空间“http://www.w3.org/1999/XSL/Format”中的“layout-master-set”。
似乎存在某种类型的命名空间引用问题,其中 xsl-fo 命名空间中的元素无法识别扩展元素是有效的子元素?
代码如下:
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:axf='http://www.antennahouse.com/names/XSL/Extensions'>
<xsl:template match='/root'>
<fo:root xmlns:fo='http://www.w3.org/1999/XSL/Format' xmlns:axf='http://www.antennahouse.com/names/XSL/Extensions'>
<axf:document-info name='title' value='value' />
</fo:root>
</xsl:template>
</xsl:stylesheet>
有趣的是,他们的网站上列出了一个与此处完全相同的示例:http://www.antennahouse.com/xslfo/axf4-extension.htm#axf.document-info
不幸的是,它似乎不适用于他们的 xsl 格式化程序的 v4.3。
【问题讨论】:
作为记录,http://www.antennahouse.com/names/XSL/Extensions
之类的命名空间 URI 不必解析为任何内容。 “XML 中的命名空间”建议 (w3.org/TR/REC-xml-names/#ns-decl) 包括“直接用于检索模式(如果存在)不是目标。” (如果它确实解决了某个问题,那么它应该解决的问题是一个完全独立的讨论。)
【参考方案1】:
我认为问题可能是 xsl-fo 不完整。错误是在将 XML 转换为 XSL-FO 时发生还是在处理 XSL-FO 时发生?
另外,如果命名空间位于 xsl:stylsheet
中,我认为您不需要将命名空间添加到 fo:root
元素中。不过,这可能特定于 XSL 处理器。 (我使用的是撒克逊语。)
我对 Antenna House 没有任何经验,但我使用具有类似扩展的 RenderX。
这是一个 XML 文件、XSL 样式表和生成的 XSL-FO 的示例。 (这在 RenderX 中运行良好。)
XML 文件
<?xml version="1.0" encoding="UTF-8"?>
<root/>
XSL 样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:rx="http://www.renderx.com/XSL/Extensions">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/root">
<fo:root>
<rx:meta-info>
<rx:meta-field name="title" value="Some Title"/>
<rx:meta-field name="author" value="DevNull"/>
<rx:meta-field name="subject" value="Some Subject"/>
<rx:meta-field name="keywords" value="abc def ghi jkl"/>
</rx:meta-info>
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block/>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
</xsl:stylesheet>
XSL-FO 输出
<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:rx="http://www.renderx.com/XSL/Extensions">
<rx:meta-info>
<rx:meta-field name="title" value="Some Title"/>
<rx:meta-field name="author" value="DevNull"/>
<rx:meta-field name="subject" value="Some Subject"/>
<rx:meta-field name="keywords" value="abc def ghi jkl"/>
</rx:meta-info>
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page">
<fo:region-body/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:block/>
</fo:flow>
</fo:page-sequence>
</fo:root>
我认为,如果您将 renderx 扩展 (rx:
) 换成天线房屋扩展,它应该可以工作。也许您应该先尝试渲染 XSL-FO,然后再尝试使用 XSL-T 生成 XSL-FO。
希望这会有所帮助。
【讨论】:
【参考方案2】:这是我的错。有一个我不知道的 xsd 模式文件。我们最终不得不在根节点和块节点中使用“any”元素,以便让模板访问天线室扩展。
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:any namespace="http://www.antennahouse.com/names/XSL/Extensions" processContents="skip"/>
...
<xs:element name="block">
<xs:complexType mixed="true">
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:any namespace="http://www.antennahouse.com/names/XSL/Extensions" processContents="skip"/>
...
【讨论】:
【参考方案3】:focheck (https://github.com/AntennaHouse/focheck) 版本包括用于 XSL 1.1 的 W3C XSD 以及 Antenna House 扩展。
【讨论】:
以上是关于天线屋 XSL-FO 扩展不工作?的主要内容,如果未能解决你的问题,请参考以下文章