内容


使用 XSLT 作为语言编译器

使用 XSLT 从 XML 生成 PostScript

Comments

使用 XSLT 作为编译器

使用 XSLT 可以将 XML 数据转换成任意的其他数据格式。通常 XSLT 被视为 XML 到 XML 的转换语言,它以 XML 文档为输入并将其转换为其他 XML 结构(包括 XHTML),但是它实际上可用于生成任意输出,而不仅仅是 XML。在考虑这种方法时,XSLT 样式表实际上是定义新语言的工具,并且可被视为语言编译器。使用这种文字编译器似乎可能有些古怪。通常,编译器被视为把人类可读代码转换为机器语言或虚拟机字节码的程序,但是一般意义上的编译器只是一个转换器:把一种语言编译成另一种语言。目标语言通常为二进制格式(如机器代码),但不总是这种格式。从这个角度讲,XSLT 是一项编译器技术。XSLT 样式表将隐式定义一种新语言,XML 方言(XML dialect),它将编译为不同的形式,可以是其他 XML 方言或其他语言。

以 XSLT 作为编译器的这个概念为例,如果需要通过 XML 生成 Java™ 代码,假定需要生成 Java bean 作为对象-关系映射系统的一部分,您可以使用 XSLT 完成此操作。Java bean 是带有默认构造函数(不获取参数的构造函数)的 Java 类,它将公开允许调用者读取和设置对象属性的 gettersetter 方法。清单 1 显示了用基于 XML 的语言定义 Java bean 类的 XML 文档示例。

清单 1. 定义 Java bean 类的 XML 文档
<java>
  <bean-class name="Employee">
    <property name="id" type="int"/>
    <property name="name" type="String"/>
    <property name="title" type="String"/>
  </bean-class>
</java>

此 XML 文档将创建一个指定许多属性的 <bean-class> 元素,每个属性都有一个名称和 Java 类型。这是一种十分简明的(像 XML 一样)语言,可以指定 Java bean 类的属性。清单 2 显示了通过此 XML 生成 Java 代码的 XSLT。

清单 2. 通过 XML 生成 Java bean 类的 XSLT
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="bean-class">
    public class <xsl:value-of select="@name"/> {
      
      <xsl:apply-templates select="property" mode="instance-variable"/>
      
      public <xsl:value-of select="name"/> () { }

      <xsl:apply-templates select="property" mode="getter-and-setter"/>
    }
  </xsl:template>

  <xsl:template match="property" mode="instance-variable">
    private <xsl:value-of select="@type"/> <xsl:text> </xsl:text> 
<xsl:value-of select="@name"/>;
  </xsl:template>

  <xsl:template match="property" mode="getter-and-setter">
    <xsl:apply-templates select="." mode="getter"/>
    <xsl:apply-templates select="." mode="setter"/>
  </xsl:template>

  <xsl:template match="property" mode="getter">
    public <xsl:value-of select="@type"/> 
get_<xsl:value-of select="@name"/>() {
      return this.<xsl:value-of select="@name"/>;
    }
  </xsl:template>

  <xsl:template match="property" mode="setter">
    public void set_<xsl:value-of select="@name"/>(<xsl:value-of 
select="@type"/> value) {
      this.<xsl:value-of select="@name"/> = value;
    }
  </xsl:template>

</xsl:stylesheet>

第一个模板将匹配 <bean-class> 元素,它将把 bean 类的 Java 代码输出为文本,与通常将 XML 元素输出为 XSLT 文档相反。首先,要生成类的私有实例变量,模板将把 <property> 子元素传递到 instance-variable 模板中(该模板将匹配 instance-variable 模式下的 “property” 元素)。然后它将生成默认构造函数,并把 <property> 元素传递到 getter-and-setter 模板中以生成属性的 gettersetter 方法。清单 3 显示了通过此样式表传递样例 XML 的结果。

清单 3. 生成 Java bean 类的 XSLT 样式表输出
public class Employee {

  private int id;
  private String name;
  private String title;

  public Employee() { }

  public int get_id() {
    return this.id;
  }

  public void set_id (int value) {
    this.id = value;
  }

  public String get_name() {
    return this.name;
  }

  public void set_name (String value) {
    this.name = value;
  }

  public String get_title() {
    return this.title;
  }

  public void set_title (String value) {
    this.value = value;
  } 
}

这将演示如何使用 XSLT 定义新语言。在这里,XSLT 样式表将隐式定义用于指定 Java 类定义的新语言。例如,您可以在生成与数据库表相对应的 Java 对象的对象-关系映射系统中使用这样一个样式表,其中 XML 是通过数据库表列生成的,或者对应于用户提供的 XML 配置(直接由开发人员提供 XML)。如果充实 XML 方言和相应的 XSLT 样式表,则可以简明地定义类关系(例如一对一、一对多和多对多基数),在这种情况下,样式表将生成用于维护子对象列表的非常精细的代码,以及用于从 SQL 数据库中和向 SQL 数据库中读取和存储对象树的代码。在定义源语言(用于指定 Java 对象的 XML 方言)后,您可以将该 XML 转换为拥有所需复杂度的代码,同时对最终开发人员隐藏所有实现逻辑,使得最终开发人员只能根据高级 XML 语言定义对象系统。

XSLT 定义新语言

在这种上下文中,任何 XSLT 样式表都将隐式定义这样一种语言,因为样式表将获取 XML 并将其转换为其他形式,与 Java 编译器获取 Java 源代码并将其转换为一系列虚拟机指令的方式相同。惟一的限制是 XSLT 专门用于处理 XML 输入,因此源语言必须被定义为 XML 方言。

另一方面,XSLT 可用于围绕其他语言和输出格式定义 XML 包装器,与 Java 语言可以被视为围绕 JVM 指令集的包装器是一样的。

由于 XML 非常普及并且非常标准,有众多支持,因此将一种语言定义为 XML 方言意味着它很容易被理解并且可以轻松地集成到其他系统中(例如,设计用于生成 XML 输出的系统)。还可以把这样一种语言集成到 XSLT 管道中,将源 XML 数据转换为包装所需输出格式的新语言。XML 的普及使其成为包装 PDF 或 PostScript 等输出格式的主要候选工具,并且可以通过编程方式生成此类文档,而无需具备 PDF 或 PostScript 语言语法的详细知识。

通过 XML 生成 Adobe PDF

Adobe 已经与 Adobe Mars 项目建立了这种逻辑连接,在该项目中,Adobe 已经定义了 PDFXML,这是一种可用于创建 PDF 文档的 XML 方言(请参阅 参考资料)。Mars 项目仍在进行开发,并且工具及教程文档方面的支持很少。Mars 文档还要求使用特殊插件才能查看,而不可以在现有 PDF 浏览器中查看。它表示一个用于创建可移植文档的全新平台,而且就这点而言,它与现有 PDF 浏览器不兼容。

另一种实现基于 XML 的文档格式的方法是:定义一种可以使用一个 XSLT 样式表或系列样式表执行转换,从而转换为现有格式(如 PDF)的 XML 方言。

可以定义将 XML 结构直接转换为 PDF 代码的 XSLT 样式表,这可能要使用 Java iText 项目的代码来指引样式表逻辑。

作为一个更简单的示例,一种中间方法将把 XML 转换为 PostScript,然后使用开源的 PostScript-to-PDF 转换程序来执行编译为 PDF 格式的最终步骤(要获得一些 PostScript-to-PDF 开源工具链接,请参阅 参考资料)。最终结果是可以使用 XML 通过编程方式创建 PDF 文档。

更简单的示例:通过 XML 生成 PostScript

对于这个生成 PostScript 的更简单示例(随后可以使用开源命令行工具将其转换为 PDF 格式),首要问题是 XSLT 的使用程度。PostScript 是一种编程语言,在这种语言中,将把操作数放入堆栈中,然后向这些操作数应用一个函数 — 名为 postfix 语法的约定,在这种约定中,函数名是在实参后指定的。因此,3 乘以 7 的 PostScript 命令是 3 7 mul。这表示 “把 3 放入堆栈中,再把 7 放入堆栈中,然后调用 mul 函数”。mul 函数被调用时将把前两个条目推出堆栈并将其相乘,然后把结果放入堆栈中。因此 PostScript 命令 3 7 mul 2 add 等效于算术表达式 (3 * 7) + 2mul 函数将把 3 乘以 7,把 21 留在堆栈中,然后把数字 2 放入堆栈中,再调用 add 函数,这将把前两个条目推出堆栈再将其相加,把 23 留在堆栈中。

PostScript 将生成呈现后的、可打印的文本和图形页面。在页面中布置文本和图形对象与上文的乘法和加法示例使用的 postfix 语法相同。PostScript 的坐标系统将把原点 (0,0) 放置在页面的左下角,并且每英寸包含 72 个点。因此,坐标 (72, 72) 表示距离页面左下角一英寸的点。例如,清单 4 显示了呈现圆圈的 PostScript。

清单 4. 呈现圆圈的 PostScript
150 150 10 0 360 arc

这段代码将在页面的 (150, 150) 位置(相对于左下角)绘制一个半径为 10 的圆圈,从 0 度到 360 度(即完整的圆圈)。与乘法类似,操作数将被逐个放入堆栈中,然后调用 arc 函数,该函数将把 5 个条目推出堆栈并使用这些值呈现一个圆圈。

使用这一条 PostScript 指令,您可以在散点图中生成一页数据点。清单 5 显示了执行此操作的 XSLT 样式表模板。

清单 5. 生成 PostScript 散点图的 XSLT 样式表
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <apply-templates select="//point"/>
    showpage
  </xsl:template>

  <xsl:template match="point">
    <xsl:value-of select="x"/> <xsl:text> </xsl:text> 
<xsl:value-of select="y"/> 5 0 360 arc
    fill
  </xsl:template>

</xsl:stylesheet>

这段代码将获取包含 <point x="30" y="50"/> 格式的 <point> 元素的 XML 文档,并生成一个 PostScript 文档将这些元素在页面上绘制为半径为 5 的点,把一组 XML 数据点转换为可视的散点图。注意顶层模板末尾处的 showpage 调用。showpage 将呈现为到当时为止绘制内容的可打印页面。

添加呈现逻辑

散点图演示了此概念的最简单应用 — 使用 XSLT 生成 PostScript — 因为它将获取 XML 元素并将其直接转换为 PostScript 命令。在本例中,XML 元素已经包含其坐标信息。当该坐标信息从数据中消失时,事情将变得更加复杂(例如当 XML 数据与呈现的 PostScript 关系不大时)。例如,比散点图更进一步,通过一组表示 y 轴值的 XML 数据值呈现线图要求 XSLT 计算清单 6 中所示的 x 轴值。

清单 6. 将一组 <temperature> 元素转换为 PostScript 线图的 XSLT
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes"/>

  <xsl:variable name="originY" select="100"/>
  <xsl:variable name="originX" select="100"/>
  <xsl:variable name="graphWidth" select="1000"/>
  <xsl:variable name="graphHeight" select="1000"/>

  <xsl:variable name="xDelta" select="$graphWidth / div count(//temperature)"/>
  <xsl:variable name="tempRange" select="200"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//temperature"/>
    stroke
    showpage
  </xsl:template>

  <xsl:template match="temperature">
    <xsl:value-of select="ceiling($="$originX  + (position() * $xDelta)"/>
    <xsl:text> </xsl:text>
    <xsl:value-of select="ceiling($originY + (@temp div / $tempRange * 
$graphHeight))"/> 
    <xsl:if test="position() = 1">
      moveto
      <xsl:if>
      <xsl:if test="position() != 1">
        lineto
      </xsl:else> 
   </xsl:if>
  </xsl:template>

</xsl:stylesheet>

此样式表将获取包含大量 <temperature temp="30"/> 格式的 <temperature> 元素的文档,并将其转换为呈现温度线图的 PostScript 堆栈。样式表将使用 count()position() XPath 函数来计算线图中各个点的 x 值。由于点必须平均分布在页面中,因此样式表将首先计算点的最远距离,方法为 pageWidth 变量除以文档中 <temperature> 元素的数目。xDelta 变量将存储结果,它表示每个温度点之间的像素数。

root-level 模板的工作原理与散点图示例中的工作原理相同,它将呈现 <temperature> 元素的指令,然后调用 showpage 以呈现图形缓冲的内容。temperature 模板将计算 x 坐标,方法为将 xDelta 值乘以 position() XPath 函数(它将返回传递到模板中的所选节点集中当前节点的索引)返回的值。它还将添加 originX 的值,该值将指定图形最左侧点的 x 坐标。它将输出该值(把它放入输出程序的 PostScript 堆栈中),然后输出 y 值,这是与图形高度成比例的温度 $originY + (@temp / $tempRange * $graphHeight)$originY 将确保最低值不低于图形的底部,而 @temp / $tempRange * $graphHeight 将查找温度与温度范围的比率,并且将该比率乘以图形的高度,生成与温度成比例且包含在图形高度内的 y 值。

使用 XSLT 在 PostScript 中呈现线

线图将一些呈现逻辑引入到了 XSLT 中,因为源 XML 文档不包括所呈现图形的所有坐标信息;样式表必须通过提供的温度值来计算图形中每条线的 x 值和 y 值。在呈现连续文本页面时存在类似的问题。例如,如果拥有 <line height="15">hello there</line> 格式的 <line> 元素的 XML 文档,则可以用清单 7 中的样式表呈现页面。

清单 7. 把 <line> 元素转换为 PostScript 的 XSLT
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml" omit-xml-declaration="yes"/>

  <xsl:variable name="pageHeight" select="720"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//line[1]">
      <xsl:with-param name="y" select="0"/>
    </xsl:apply-templates>
    showpage
  </xsl:template>

  <xsl:template match="line">
    <xsl:param name="y"/>

    /Helvetica findfont <xsl:value-of select="@height"/> scalefont setfont

    0 <xsl:value-of select="$pageHeight - $y"/> moveto

    (<xsl:value-of select="text()") show

    <xsl:apply-templates select="following-sibling::line[1]">
      <xsl:with-param name="y" select="$y + @height"/>
   </xsl:apply-templates>

  </xsl:template>

</xsl:stylesheet>

此样式表演示了许多内容。最终结果是获取 <line height="20">some text</line> 格式的一组 <line> 元素,并且生成在页面中逐条呈现线的 PostScript 命令,允许各条线拥有各自的 height 变量来指定文本的高度而使其字体大小有所不同。

此样式表将解决如何维护下一行文本的 y 坐标值这个大问题,因为该值将针对添加到页面中的每一行增加可能不同的值。这个问题与线图需要解决的问题不同,在线图中所有数据点都是按相等的距离分隔的,因此可以使用声明公式轻松地定位。在本例中,相邻元素之间的距离可能会不同,这取决于每个元素中的数据,而且必须维护一个累积 y 值,因为样式表将在源文档中的数据行之间移动。使用获取参数的递归模板可以解决此问题。<xsl:param> 元素将指定调用时可以传递到模板中的实参,从而增加了 XSLT 的功能。在本例中,它允许您维护 y 坐标值,从而将更新后的 y 值传递给下一次递归调用的 line 模板。

line 模板将接受 y 参数,表示在调用 line 模板时,将把此参数的值传递给该模板,类似于将实参传递给函数调用。该模板将使用 <line> 元素的 height 属性设置文本行的字体(并因此设置行的高度)。模板的下一行将把 PostScript 图形光标移到 x 值 = 0(页面左侧边缘),y 值 = $pageHeight - $y 的位置,因为 PostScript y 值相对于页面左下角的原点,而数据中的 <line> 元素是按照从顶部到底部的顺序排列的。此处的 $y 值是模板的 y 参数的值。然后模板将使用 PostScript show 命令显示 <line> 元素的文本;PostScript 文本字符串包含在圆括号中。

模板的最后一个子句将处理递归,使用数据中当前 <line> 元素的下一个兄弟元素调用同一个模板,传入用该行的高度更新的 y 值,以定位直接位于该行下方的文本。注意,根模板还将用值为 0 的 y 参数调用此模板,以启动页面中的递归流程。

将呈现逻辑从 XSLT 移到 PostScript 中

线图样式表包括了大量计算,并且呈现文本行的样式表还包括了大量逻辑来计算 y 坐标。由于这些样式表实际上都是编译器,因此将 XML 数据转换为面向过程的编程语言(即,PostScript),这种把所有呈现逻辑放入 XSLT 中的备选方法是把呈现逻辑放入生成的 PostScript 中,并且允许 PostScript 在运行时执行,而不是在编译时执行呈现计算。这是将一种编程语言编译为另一种编程语言时所面临的常见选择:在编译器中有多少工作要做,还有多少工作是留给生成的语言在运行时完成的。通常需要在编译时完成尽可能多的工作以获得更好的性能。由于 PostScript 专门用于简化呈现图形和文本页面的操作,而 XSLT 用于执行 XML 数据到其他格式的转换,因此完整的简化方法就是让每种语言执行自己最擅长的操作,并将呈现逻辑从 XSLT 中移出并移到生成的 PostScript 中。

例如,清单 7 的文本呈现样式表在 XSLT 中维护 y 坐标值,而清单 8 显示的备选方法将在生成的 PostScript 中执行等效操作。

清单 8. 在页面中呈现文本行,将呈现计算移到运行时 PostScript 中的备选 XSLT 样式表
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" omit-xml-declaration="yes"/>

  <xsl:template match="/">

    /y 72 11 mul def

    /text_line 
    { 
      /height exch def
      /text exch def 
      /y pop def
      /Helvetica findfont height scalefont setfont
      /y y height sub def        
      0 y moveto
      text show
     }
    bind def

   <xsl:apply-templates select="//line"/>
    showpage

  </xsl:template>

  <xsl:template match="line">
   (<xsl:value-of select="text()"/>) <xsl:value-of 
select="@height"/> text_line
</xsl:template> 

</xsl:stylesheet>

root-level 模板将定义名为 /y 的 PostScript 变量,设为以点为单位的页面高度(72 个点/英寸),并且定义名为 text_line 的函数。/text_line 指向 PostScript 查找字典中的条目,花括号({})中的内容包含绑定到该条目上的函数定义,并且末尾的 bind def 将把条目名称 text_line 绑定到该函数定义上。

text-line 将把局部变量设为堆栈中的值 — 文本值和高度 — 意味着以 text height text_line 格式调用 text_line(例如,(hello there) 20 text_line 用于定位当前 y 值位置上高度为 20 的文本 “hello there”)。text_line 将使用提供的高度值作为字体的刻度值来设置字体。然后它将把图形光标移到 x 坐标等于 0(左侧边缘)以及提供的 y 坐标位置,并显示给定的文本字符串。随后把给定的高度添加到给定的 y 值中,把全局变量 /y 设为总和,在每次调用 text_line 时在页面中保持一个运行的 y 计数器。

最后,根模板将把 0 放入堆栈中作为初始的 y 值,从而用源文档中的所有 <line> 元素调用 line 模板。由于所有的逻辑现在都在 text_line PostScript 函数中,因此 line 模板本身变得微不足道 — 每个 <line> 元素都直接转换为对 text_line PostScript 函数的调用。

使用 PostScript 处理所有呈现逻辑,样式表可以不受约束地轻松定义更丰富的语言,例如全部的 XHTML,让您可以将文档指定为 XHTML 并将其编译成 PostScript 文档(这种文档可以轻松地转换为 PDF)。

抽象层

在开发像 XHTML 这样一种语言的样式表时,您又面临一次选择:每个样式表模板对于 PostScript 的了解 程度如何,这意味着每张模板包含多少 PostScript 逻辑来呈现自身。一种解决方案是为各种 XHTML 标记(如 <h1_>、<h2>、<h3> 和 <div>)、每条输出 PostScript 命令(如对 text_line 的调用)创建模板以呈现这些内容。这种解决方案将把样式表(XHTML)中定义的语言与 PostScript 中定义的语言紧密耦合在一起。作为一种备选方法,您可以在呈现的 PostScript 中定义 /h1/h2//h3/div 之类的函数,将每个 XHTML 标记转换为对各自函数的调用,类似于 清单 8 中的代码将 <line> 标记直接转换为对 text_line PostScript 函数的调用。在这种情况下,XSLT 样式表在可用函数方面围绕在 PostScript 中已经定义的语言,真正地定义了一种 XML 包装器语言,并且生成的 PostScript 是与 XHTML 的定义紧密耦合的。在这两种情况下 — 把大量 PostScript 知识放入 XHTML 标记中,或者把大量 XHTML 知识放入 PostScript 函数(通过创建每个 XHTML 标记的 PostScript 函数)— 解决方案将结合应当保持独立的两个关注点。一个关注点是呈现一页连续文本的问题,这是页面呈现语言 PostScript 最擅长处理的问题;而另一个关注点是定义 XHTML 语言的问题,这是定义 XML 方言的 XSLT 最擅长处理的问题。

简言之,您拥有在此处放置抽象层的空间,可以实现为两个按顺序应用的 XSLT 样式表。第一个样式表将定义 XHTML 语言的模板,但是不会将其转换为 PostScript 命令或者 PostScript 函数调用,而是将其转换为第二个样式表所定义的中间 XML 方言。第二个样式表将定义 XHTML 与 PostScript 之间的中间语言,创建定义一页连续元素所需的标记。第二个样式表将把这些标记转换为呈现一页连续文本所需的一组核心 PostScript 函数。核心函数集将包括管理 x 和 y 光标值、自动换行、分页及呈现文本元素之类的行为。清单 8 将把 <line> 元素转换为对 text_line PostScript 函数的调用,它是第二个中间样式表的示例;它将围绕 PostScript 函数 text_line 定义一个包装器元素 <line>。第一个样式表将定义所有 XHTML 标记的模板,这些 XHTML 标记的所有输出标记都是在第二个样式表中定义的,如 <line>。例如,清单 9 显示了 XHTML 样式表的子集。

清单 9. 将 XHTML 的子集转换为中间 XML 方言的 XSLT 样式表
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes"/>

  <xsl:param name="h1_height"/>
  <xsl:param name="h2_height"/>

  <xsl:template match="/">
    <lines>
      <xsl:apply-templates/>
    </lines>
  </xsl:template>


  <xsl:template match="//h1">
    <line height="$h1_height"><xsl:value-of select="text()"/></line>
  </xsl:template>

  <xsl:template match="//h2">
    <line height="$h2_height"><xsl:value-of select="text()"/></line>
  </xsl:template>

</xsl:stylesheet>

此样式表将定义 XHTML 的小型子集,将其转换为第二个样式表的呈现页面的中间 XML 方言(“连续文本” 语言)。清单 9 中的样式表将获取两个参数:h1_heighth2_height,它们允许调用者指定 <h1> 和 <h2> 标记的字体大小。例如,调用者可以解析 CSS 样式表,并传入基于定义的 CSS 样式的 h1_height 和 h2_height 值。//h1//h2 模板将把 XHTML 专用的 <h1> 和 <h2> 标记转换为通用的 <line> 标记,通用的 <line> 标记刚好在页面中定义具有指定高度的文本行。

这种促使人们开始使用两个样式表的解耦原理允许重用样式表,例如将 XHTML 转换为诸如 RTF 之类的其他格式,或者将诸如 RTF 之类的其他格式转换为第二个样式表中定义的中间 “连续页面” 方言,可能按照将 RTF 文档呈现为 PostScript 的顺序。如果可以将呈现逻辑保留在 PostScript 本身中,XSLT 样式表就可以随意定义源 XML 语言,并且分离目标功能的角色(PostScript 呈现逻辑)和语言定义(XSLT 样式表)。

结束语

XSLT 通常不被视为语言编译器,但是在定义一种数据结构到另一种数据结构的转换时,它就是一种语言编译器。而且作为编译器,XSLT 样式表将隐式定义源文档的语言。因此,您可以使用它把 XHTML 之类的语言与 PostScript 或 XML 和 Java 之类的无关语言联系在一起,从而通过逐步转换为目标语言来呈现其他格式的文档。


相关主题

  • 您可以参阅本文在 developerWorks 全球网站上的 英文原文
  • 维基百科中的 PostScript:了解这种经常在电子和桌面出版中使用的描述语言的历史。
  • Adobe PostScript 3:访问这项打印和成像技术的主页。
  • PostScript Language Reference:了解这种用于描述打印页面或显示页面的文本外观、图形和样例图像的中间编程语言。
  • Adobe Mars Project:了解 PDF 文档的 XML 兼容表示方法 PDFXML。
  • 由万维网联盟维护的 XSLT 2.0 规范:了解 XSLT 2.0 的语法和语义的更多信息,这是一种将 XML 文档转换为另一种 XML 文档的语言。
  • XSLT 是什么类型的语言?(Michael Kay,developerWorks,2001 年 2 月,更新于 2005 年 4 月):XSLT 是哪种语言?用途是什么?以及为什么采用这样的方法来设计?找到这些问题的答案。
  • 国际化的 XSLT 样式表和 XML 字典方法 (Laura Menke,developerWorks,2001 年 4 月):查看 XSLT 如何解决实际问题的示例。
  • XSLT 处理程序是如何工作的(Benoit Marchal,developerWorks,2004 年 3 月):了解更多有关 XSLT 背后的理论,以及使用 XSLT 实现快速编程的递归性。
  • 技巧:在 XSLT 2.0 中创建多个文件(Jack Herrington,developerWorks,2005 年 3 月):探讨这篇 developerWorks 技巧中运行的 xsl:result-document 示例。
  • XSLT: Working with XML and HTML(Khun Yee Fung,Addison-Wesley,2000 年 12 月):探究 XSLT 的综合参考及教程。
  • XSLT Functions:查阅 w3school.com 中的丰富参考资料。
  • ps2pdf:查看 PostScript-to-PDF 转换器的工作原理。
  • Preview:尝试使用这个用于显示图像和可移植文档格式(Portable Document Format,PDF)文档的 Mac OS X 应用程序。
  • XML 技术文档库:查看 developerWorks XML 专区,获得各种技术文章和技巧、教程、标准和 IBM 红皮书。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=366047
ArticleTitle=使用 XSLT 作为语言编译器
publish-date=01222009