【发布时间】:2017-07-17 21:40:03
【问题描述】:
我和许多人一样,在理解如何控制 xslt 输出中的某些 xslt 命名空间声明时遇到了困难。我在 Java 中使用最新版本的 Saxon XSLT 2.0 处理器。我能够找到解决<xsl:output> 命名空间声明时遇到的大多数问题的解决方案,但我遇到了<xsl:result-document> 命名空间声明的问题。我正在使用 XSL 创建部分 epub3 文件。
以下是我的 XSLT 2.0 文件的相关部分
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:epub="http://www.idpf.org/2007/opf"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="my:functions"
exclude-result-prefixes="xs xsl dc epub my"
version="2.0">
<xsl:output name="xhtml" method="xhtml" indent="yes"/>
<xsl:output name="xml" method="xml" indent="no"/>
<!--content.opf -->
<xsl:result-document href="{concat('ePubs/ePub',project/bookAbbrev,'/OEBPS/content.opf')}" format="xml" indent="yes">
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="en" unique-identifier="pub-identifier">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="pub-identifier">temporary-<xsl:value-of select="/project/bookAbbrev"/>1</dc:identifier>
<dc:title><xsl:value-of select="/project/bookTitle"/>-v1</dc:title>
<dc:language>en</dc:language>
<dc:creator id="creator">MDB</dc:creator>
<dc:subject>history</dc:subject>
<dc:date>2017-06-26</dc:date>
<meta name="cover" content="cover-image"/>
<meta property="dcterms:modified"><xsl:value-of select="format-dateTime(current-dateTime(),'[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]Z')"/> </meta>
</metadata>
</package>
</xsl:result-document>
<!-- end content.opf -->
</xsl:stylesheet>
我没有包含 XML 文件,因为我认为在本示例中不需要它。我还删除了其他结果文档部分。
此 .opf 文件的所需输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf"
version="3.0"
xml:lang="en"
unique-identifier="pub-identifier">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier" id="pub-identifier">temporary-WB-A1</dc:identifier>
<dc:title>Christian County Kentucky Will Book A-v1</dc:title>
<dc:language>en</dc:language>
<dc:creator id="creator">MDB</dc:creator>
<dc:subject>history</dc:subject>
<dc:date>2017-06-26</dc:date>
<meta name="cover" content="cover-image"/>
<meta property="dcterms:modified">2017-07-17T16:44:57Z</meta>
</metadata>
</package>
但不是 <metadata> 元素持有 xmlns:dc 命名空间声明,而是所有子元素都有 xmlns:dc 声明和父元素 no 声明,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://www.idpf.org/2007/opf"
version="3.0"
xml:lang="en"
unique-identifier="pub-identifier">
<metadata>
<dc:identifier xmlns:dc="http://purl.org/dc/elements/1.1/" id="pub-identifier">temporary-WB-A1</dc:identifier>
<dc:title xmlns:dc="http://purl.org/dc/elements/1.1/">Christian County Kentucky Will Book A-v1</dc:title>
<dc:language xmlns:dc="http://purl.org/dc/elements/1.1/">en</dc:language>
<dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/" id="creator">MDB</dc:creator>
<dc:subject xmlns:dc="http://purl.org/dc/elements/1.1/">history</dc:subject>
<dc:date xmlns:dc="http://purl.org/dc/elements/1.1/">2017-06-26</dc:date>
<meta name="cover" content="cover-image"/>
<meta property="dcterms:modified">2017-07-17T16:44:57Z</meta>
</metadata>
</package>
任何帮助或解释将不胜感激。我已经多次搜索该论坛,但我认为我在其他帖子中找到的解决方案与这个问题并不完全相同。我希望我的问题中发布的信息足以说明问题。我是具有 XSL 经验的中级新手,因此可能使用了一些不恰当的术语。 谢谢 - 迈克尔
【问题讨论】:
-
如果从
xsl:stylesheetelement 中删除xmlns:dc="http://purl.org/dc/elements/1.1/"声明会怎样? -
我确实尝试过,并从 Saxon XSLT 2.0 处理器
Error at xsl:stylesheet on line 9 column 16 of DB-WB-CO-epubText-split.xsl: XTSE0808: Namespace prefix dc is not declared Stylesheet compilation failed: 1 error reported得到以下错误消息@ -
我们需要一个小而完整的例子——最好是没有
xsl:result-document(和xml:template)的例子。 -- FWIW,你得到的输出和你想要的输出之间的区别纯粹是装饰性的。 -
迈克尔,感谢您的评论。我发布的代码来自我的工作样式表。我只删除了所有其他创建附加文件的结果文档部分。此特定部分仅从 XML 文件中读取几个值。如果这样会更好,我可以用设置文本替换 xsl:value-of 调用。样式表中没有其他模板被调用。您可能是正确的,它不重要,但我正在尝试匹配我在参考 epub3 文档中找到的格式。谢谢,迈克尔
-
嗯,有些东西不适合这里,因为从
xsl:stylesheet元素中删除xmlns:dc="http://purl.org/dc/elements/1.1/"声明不应该产生错误:声明在metadata元素中重复,我不'没有看到它在这个范围之外的任何地方被使用。