【问题标题】:Docbook XSL: Set a default size/scale for imagedata elements?Docbook XSL:为图像数据元素设置默认大小/比例?
【发布时间】:2025-11-29 14:15:01
【问题描述】:

为 DocBook 编写一些样式表。

编辑: 根据下面的评论:是的,这意味着我正在编写基于 DocBook-XSL 样式表的自定义,而不是重写现有的 DocBook 样式表。

是否可以通过 XSL 样式表为 imagedata 元素设置默认大小/比例,尤其是在打印输出中?

基本上我想设置这样的东西,如果我在imagedata 元素中包含scalefitwidth 和/或contentdepth 属性,则将使用这些属性;但是,如果不包含它们,它们将默认为 scalefit="1" width="100%" contentdepth="100%"

看起来很简单,但我是 XSLT 新手,谷歌搜索让我一无所获。这可能吗?怎么样?

谢谢!

【问题讨论】:

  • 当您说“为 DocBook 编写一些样式表”时,您实际上是指您正在编写基于 DocBook-XSL stylesheets 的自定义吗?

标签: xml xslt xsl-fo apache-fop docbook


【解决方案1】:

基本上我想设置这样的东西,如果我包含scalefitwidth 和/或 contentdepth 属性在 imagedata 元素中, 这些属性将被使用;但是,如果它们不包括在内,它们 将默认为scalefit="1" width="100%" contentdepth="100%"

这种转变

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="imagedata[not(@scalefit|@width|@contentdepth)]">
  <imagedata scalefit="1" width="100%" contentdepth="100%">
   <xsl:copy-of select="@*"/>

   <xsl:apply-templates/>
  </imagedata>
 </xsl:template>
</xsl:stylesheet>

应用于以下 XML 文档时

<t>
 <imagedata scalefit="1" width="80%" contentdepth="90%"/>
 <imagedata/>
</t>

产生想要的正确结果

<t>
   <imagedata scalefit="1" width="80%" contentdepth="90%"/>
   <imagedata scalefit="1" width="100%" contentdepth="100%"/>
</t>

说明:为不具有scalefitwidthcontentdepth 属性的任何imagedata 覆盖身份规则

【讨论】:

  • 感谢您的快速回答...但是,当我将这些模板添加到我的样式表时出现以下错误:net.sf.saxon.trans.XPathException: org.apache.fop.fo。 ValidationException:“fo:root”缺少子元素。所需的内容模型:(layout-master-set, declarations?, bookmark-tree?, (page-sequence|fox:external-document)+) ...知道这意味着什么吗?
  • @DanM:我对 XSL-FO 一无所知。在这个答案中,我提供了一个适用于任何 XML 文档的解决方案——您必须将其调整为 your XML 文档,我相信这将是 XSL-FO 的一个实例——这意味着您必须在您的 XSL-FO 程序中满足 XSL-FO 的任何语法和语义要求——这些与您的问题根本无关,即:如何将默认属性添加到没有的元素这些属性——并且已经得到了充分的回答。