使用 XSLT 创建带有嵌套粗体/斜体标签的 XSL-FO

Posted

技术标签:

【中文标题】使用 XSLT 创建带有嵌套粗体/斜体标签的 XSL-FO【英文标题】:Using XSLT to create XSL-FO with nested bold/italic tags 【发布时间】:2011-10-25 17:12:52 【问题描述】:

我正在创建 xslt 文件,它应该将我的 xml 转换为 xsl-fo。

XML 是这样的:

<doc>
  <par>
    <point>
      <text>some text</text>
    </point>
  </par>
</doc>

当然,文档中有很多段落和要点。我想增加格式化“一些文本”的可能性,例如

<bold>bolded text</bold> and <italic>italic</italic>

应该给

<fo:block><fo:inline font-weight="bold">bolded text</fo:inline> and <fo:inline font-style="italic">italic</fo:inline>

现在我有一个非常简单的 xslt 文档,如下所示:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes"/>
  <xsl:param name="versionParam" select="'1.0'"/> 
  <xsl:template match="doc">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="simpleA4" page- page- margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
          <fo:region-body margin="2cm"/>
          <fo:region-before margin="0.2cm" extent="1.5cm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="simpleA4">
        <fo:static-content flow-name="xsl-region-before"  margin-right="1cm"> 
            <fo:block text-align="start" margin-top="0.2cm">
            <fo:block text-align="end" margin-top="0.2cm">
                Page <fo:page-number/> of <fo:page-number-citation ref-id="terminator"/>
            </fo:block>
        </fo:static-content>
        <fo:flow flow-name="xsl-region-body">
          <xsl:apply-templates select="par/point"/>
          <fo:block id="terminator"/>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
  <xsl:template match="point">
    <fo:block font-size="16pt" space-after="5mm">
        <xsl:value-of select="tresc"/>
    </fo:block>
  </xsl:template>
</xsl:stylesheet>

我应该添加另一个模板(粗体、斜体)吗?我应该如何在“文本”节点中调用它?

我找到了一些解决方案:

<xsl:template match="//bold">
    <fo:inline font-weight="bold">
        <xsl:value-of select="current()"></xsl:value-of>
    </fo:inline>
</xsl:template>

但这对我不起作用。输出 xsl-fo 不包含任何 fo:inline。

【问题讨论】:

【参考方案1】:

看看这个例子。它清楚地显示了如何处理内联节点。

[XSLT 1.0]

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:output indent="yes"/>

    <xsl:template match="doc">
        <fo:root>
            <fo:page-sequence>
                <fo:flow>
                    <xsl:apply-templates select="par/point"/>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="point">
        <fo:block font-size="16pt" space-after="5mm">
            <xsl:apply-templates select="node()"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="bold">
        <fo:inline font-weight="bold">
            <xsl:apply-templates select="node()"/>
        </fo:inline>  
    </xsl:template>

    <xsl:template match="italic">
        <fo:inline font-style="italic">
            <xsl:apply-templates select="node()"/>
        </fo:inline>
    </xsl:template>

</xsl:stylesheet>

给定:

<doc>
    <par>
        <point>
            <text>some <bold>bold</bold></text>
        </point>
    </par>
    <par>
        <point>
            <text>some <italic>italic <bold>bolded</bold></italic></text>
        </point>
    </par>
</doc>

产生:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:page-sequence>
      <fo:flow>
         <fo:block font-size="16pt" space-after="5mm">
            some <fo:inline font-weight="bold">bold</fo:inline>
               </fo:block>
         <fo:block font-size="16pt" space-after="5mm">
            some <fo:inline font-style="italic">italic <fo:inline font-weight="bold">bolded</fo:inline>
            </fo:inline>
               </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

【讨论】:

select="node()" 是多余的。来自w3.org/TR/xslt#section-Applying-Template-Rules:“在没有select 属性的情况下,xsl:apply-templates 指令处理当前节点的所有子节点,包括文本节点。”

以上是关于使用 XSLT 创建带有嵌套粗体/斜体标签的 XSL-FO的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 XForms 标签和提示上添加丰富的格式(粗体、斜体、下划线)吗?

我可以使用 OCR 检测字体样式(粗体、斜体)吗? [关闭]

启用 <textarea> 显示 HTML 内容,例如粗体、斜体、颜色、img 标签

HTMLHTML 标签 ③ ( 文本格式化标签 | 加粗 | 斜体 | 下划线 | 删除线 | 标签属性 | 图像标签 | 图像标签属性 )

XSLT 访问和创建嵌套 xml 并将标签转换为属性

markdown标签