向简历添加 XML 结构

应用 HR-XML、样式表、格式化对象和名称空间

本文探讨如何应用一些 XML 结构来存储简历数据。使用来自 HR-XML 和 Open Applications Group Integration Specification (OAGIS) 项目的元素和 Apache Formatting Objects Processor (FOP),构建一些数据和样式表文件来生成一个 PDF 文件格式的示例简历。本文的关键点包括多个名称空间的处理,以及一些关于如何通过样式表美化基本 PDF 的提示。

Colin Beckingham, 研究人员, 自由职业者

Colin Beckingham 居住在加拿大安大略省,是一位自由研究人员、作家和程序员。他拥有金斯顿皇后大学的学位,对园艺、赛马、教育、公共服务、零售和旅游/观光领域都有涉猎。他是数据库应用程序的作者,也是大量报纸、杂志和在线文章的撰稿人,他的研究兴趣包括 Linux ® 上的开源编程以及语音控制应用程序。



2011 年 2 月 28 日

您可以在一个 What You See Is What You Get (WYSIWYG) 编辑器内轻松迅速地撰写一份简历,只需几下鼠标单击即可将其转换为一个 PDF 文件,然后将其发送给一个前景看好的雇主。那么,为何还要额外花费力气先将数据存储到一个 XML 文件中呢?用额外的步骤增加流程的难度可能会导致错误,因此这种额外工作需要一个充分的理由。

常用缩略词

  • PDF:可移植文档格式
  • URL:统一资源定位符
  • W3C:万维网联盟
  • XML:可扩展标记语言

理由有两点:一是数据和呈现的分离;一个后端结构(比如 XML)带来的好处。当数据变得更加复杂,输出要求变化多端时,XML 能够提供准确性、可移植性和适应性。数据迷试图将所有数据都存储在一个数据库中。一个复杂数据结构对于一份简单的简历是否过度,要取决于您的需求和数据更改的频率。

许多雇主对不完整的简历没有好感。结构很有用 — 元素能够提醒您文档中必须出现的内容。您可以在各种平台上使用 XML,一个 XML 后端能够根据雇主的要求,通过使用不同的样式表提供一份简历(短版本)或一份履历(长版本)。

流程

本文描述的流程使用 Apache FOP(参见 参考资料)和一个 Extensible Stylesheet Language (XSL) 样式表从一个 XML 数据文件生成一个 PDF 文件。样式表控制数据的呈现并遵循 W3C 文档中描述的标准格式(参见 参考资料)。

您可以使用您自己的独特架构将简历数据保存为纯 XML 格式。但像 HR-XML 这样的标准格式有一些好处。如果您有该标准没有涵盖的特殊需求,可以轻松地从该标准获取需要的内容并通过为额外内容创建一个个人名称空间来扩展它。


HR-XML 和 OAGIS

HR-XML 和 OAGIS(参见 参考资料)是两个开源项目,它们一起提供一种结构,许多大型组织都认为该结构在人力资源和业务上下文中很重要。

HR-XML 是人力资源领域专家的智慧结晶。这些专家从雇主的角度看待问题,因此这个架构包含大量信息,而不仅仅是面试阶段需要的信息。管理人是一项复杂工作。HR-XML 涵盖招聘、背景核实、能力评估、雇佣、实时报告和修正、福利管理、绩效目标、评估等领域。

HR-XML 专用于人力资源行业,而 OAGIS 则检查跨行业数据交换标准。它处理各个行业通常共有的理念和概念,而将行业特有的元素留给行业内拥有专业知识的专家组处理。

HR-XML 小心翼翼地避免重新创建更广泛的 OAGIS 元素组已经创建的理念 — 它只向自己的名称空间添加新内容。生成的结果是一个架构,该架构基于在给定的人力资源上下文中要存储什么内容(元素)和如何存储(属性、层级),因此,有什么理由拒绝从他们的工作中获益呢?要了解 HR-XML 使用的架构的详细信息,可以下载它或在它的网站上在线查看(需要注册)。如果下载的是 3.1 版,则下面的路径将指向 Candidate 元素的相关文档。

.../HR-XML-3_1/org_hr-xml/3_1/Documentation/Guidelines/ch21.html#id564065

要在线查看,下面的 URL 是一个不错的起点:

http://ns.hr-xml.org/schemas/org_hr-xml/3_1/Documentation/ComponentDoc/Candidate-noun.php

数据文件

清单 1 是采用 Candidate 元素和它的一些子元素的一个基本数据文件示例 — 一个更大的文件的一部分。

清单 1. 示例数据文件
<?xml version="1.0" encoding="UTF-8"?>
<hr:Candidate 
  xmlns:hr="http://www.hr-xml.org/3" 
  xmlns:ccts="urn:un:unece:uncefact:documentation:1.1" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:oa="http://www.openapplications.org/oagis/9">
  <hr:DocumentID>000000001</hr:DocumentID>
  <hr:CandidatePerson>
    <hr:PersonName>
      <hr:FormattedName>Blimpo Togwer</hr:FormattedName>
      <oa:GivenName>Blimpo</oa:GivenName>
      <hr:FamilyName>Togwer</hr:FamilyName>
    </hr:PersonName>
    <hr:Communication>
      <hr:ChannelCode>Mail</hr:ChannelCode>
      <hr:Address>
        <oa:AddressLine sequence="1">5555 Yellow Brick Road</oa:AddressLine>
        <oa:AddressLine sequence="2">RR #1</oa:AddressLine>
        <oa:CityName>Lesser Village</oa:CityName>
        <oa:CountrySubDivisionCode>KKK</oa:CountrySubDivisionCode>
        <hr:CountryCode>XX</hr:CountryCode>
        <oa:PostalCode>AAA BBB</oa:PostalCode>
      </hr:Address>
    </hr:Communication>
  </hr:CandidatePerson>
</hr:Candidate>

这个代码段是一个完整但相当简单的示例,它展示了几个细节:

  • XML 声明后面是根元素 Candidate
  • Candidate 在这里拥有在由其前缀表明的 hr 名称空间中定义的含义。
  • hr 名称空间与标签 http://www.hr-xml.org/3 关联。
  • 每个元素前面都有一个名称空间标签,以消除元素表示的内容的所有歧义。
  • 一些元素在 hr 名称空间(HR-XML)中定义,另一些元素在 oa 名称空间(OAGIS)中定义。它们根据需要混合和匹配。
  • CountryCode 需要一个两字符代码,比如 USFR
  • CountrySubDivisionCode 表示一个州、一个省、一个部门,或一个国家中的其他主要管理区域。
  • 层级很重要。例如,要获取城市名称,路径涉及:Candidate > CandidatePerson > Communication > Address

使用来自 HR-XML 的在线架构资源来获取其他元素(比如 CandidateProfile)的名称,那些元素允许您添加更多信息,比如 CandidateObjectiveEducationHistoryPublicationHistoryCertifications,等等。

名称空间

名称空间是解决赋予 XML 元素名称时可能发生的歧义的结构。参见 参考资料 了解关于开始使用名称空间的更多信息。它们实施很好的原则;但是您需要小心使用它们,以确保获取正确的数据,否则可能会发生错误 — 许多错误将以静默方式发生。例如,如果您引用您的 education 小节但没有指定名称空间,处理程序很有可能不能发现任何内容,因此也不会在该小节中打印任何内容,同时不会给出任何警告。


编辑

要修改 XML 文件,由于数据文件和样式表都是纯 XML,因此您可以使用您钟爱的 XML 或文本编辑器。例如,获取 Eclipse(参见 参考资料),打开一个新项目,将 清单 1 中的代码复制并粘贴到一个新文档中,编辑,您将很快创建一个结构化简历数据文件。


样式表

要获取一些关于如何构建和使用样式表的教程,请参见 W3C XSL web 页面(参见 参考资料)。

清单 2 是简历上下文中的一个基本样式表示例。

清单 2. 示例样式表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:fo="http://www.w3.org/1999/XSL/Format" 
  xmlns:oa="http://www.openapplications.org/oagis/9"
  xmlns:hr="http://www.hr-xml.org/3">
<xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="page1">
          <fo:region-body margin="1in" />
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="page1">
        <fo:flow flow-name="xsl-region-body">
          <fo:block text-align="right" font-size="12pt" font-family="serif">
            DocumentID: <xsl:value-of select="hr:Candidate/hr:DocumentID" />
          </fo:block>
          <fo:block>
            <fo:leader leader-pattern="dots" leader-length="100%" />
          </fo:block>
          <fo:block font-size="12pt" font-family="serif">
            Curriculum Vitae - Résumé
          </fo:block>
          <fo:block font-size="20pt" font-family="Arial" font-weight="bold">
            <xsl:value-of 
              select="hr:Candidate/hr:CandidatePerson/hr:PersonName/hr:FormattedName" />
          </fo:block>
          <fo:block font-size="12pt" font-family="serif">
            Contact
          </fo:block>
          <xsl:for-each 
        select="hr:Candidate/hr:CandidatePerson/hr:Communication[hr:ChannelCode='Mail']">
            <fo:block font-size="10pt" font-family="Arial" font-weight="normal">
              <xsl:value-of select="hr:Address//oa:AddressLine[@sequence=1]" />, 
                <xsl:value-of select="hr:Address/oa:AddressLine[@sequence=2]" />
            </fo:block>
            <fo:block font-size="10pt" font-family="Arial" font-weight="normal">
              <xsl:value-of select="hr:Address/oa:CityName" />, 
                <xsl:value-of select="hr:Address/oa:CountrySubDivisionCode" />
            </fo:block>
            <fo:block font-size="10pt" font-family="Arial" font-weight="normal">
              <xsl:value-of select="hr:Address/oa:PostalCode" />, 
                <xsl:value-of select="hr:Address/hr:CountryCode" />
            </fo:block>
          </xsl:for-each>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

清单 2 中的指令控制如何在页面上显示 清单 1 中的数据:

  • 这个文档需要 4 个不同的名称空间。所有数据引用都显式表明每个节点上的名称空间,避免在允许默认名称空间(其中不使用前缀)时可能产生的混乱。
  • 模板匹配是一个正斜杠(/),表明搜索从数据文档的根元素开始。
  • 样式表指定一个布局主集合,该集合定义整个文档的所有页面,然后为各个页面定义一个页面序列元素。
  • 每个页面都需要一系列 block 元素,那些元素指示处理程序将一个项目放置到页面上的哪个位置以及如何显示它,包括字体和字体大小。
  • 样式表使用 for-each 语句来迭代元素组。例如,可能有多个通信通道:邮件、电子邮件、电话等。使用方括号([])标记,您可以指定一个过滤器 — 在本例中,样式表只过滤 Mail 项目。

使用 Apache FOP 输出

Apache FOP 联合使用数据文件和样式表生成 PDF。FOP 不仅限于 PDF 输出 — 还可以生成 Rich Text Format (RTF)、Printer Command Language (PCL)、PostScript (PS)、Advanced Function Presentation (AFP)、Tagged Image File Format (TIFF)、Portable Network Graphics (PNG)、以及纯文本文件。

要获取并安装 FOP,只需下载并解压二进制版本(参见 参考资料),然后就可以从下载位置运行 FOP 了。

下面是到 fop 的一个命令行指令示例。在本例中,数据、样式和配置文件都位于一个目录中。将那个目录作为工作目录,您可以从它自己的位置调用 fop

/path/to/fop/fop -c fop.xconf -xml exx.xml -xsl exx.xsl -pdf exx.pdf

本指令指示 fop 可执行文件执行以下操作:

  • 在 fop.xconf 文件中查找配置信息
  • 在 exx.xml 文件中查找数据
  • 使用 exx.xsl 样式表生成 exx.pdf 输出

配置文件很重要,看起来如 清单 3 所示:

清单 3. FOP 配置文件
<?xml version="1.0"?>
<fop version="1.0">
  <base>.</base>
  <source-resolution>72</source-resolution>
  <target-resolution>72</target-resolution>
  <default-page-settings height="11in" width="8.26in"/>
  <renderers>
    <renderer mime="application/pdf">
      <filterList>
        <value>flate</value>
      </filterList>
      <fonts>
        <auto-detect />
      </fonts>
    </renderer>
  </renderers>
</fop>

在这个配置中,filterlist 元素控制如何在 PDF 输出中压缩对象,fonts 元素指示处理程序使用操作系统已经知道的字体。

图 1 是前面几个列表的输出在一个 PDF 阅读器中的屏幕截图,显示了运行这个转换的结果。

图 1. PDF 输出
PDF 输出的屏幕截图,带有一个文档 ID、名称和联系信息

PDF 美化

样式表能包含简单美化项目:

  • 这个示例中出现了一些点行,下面的代码生成它们:
    <fo:block>
      <fo:leader leader-pattern="dots" leader-length="100%" />
    </fo:block>
  • 可以使用 Nicholas Chase 的 developerWorks Tip(参见 参考资料)中包含的技术或使用以下代码生成一些空行:
    <fo:block>&#160;</fo:block>

参见 FOP 文档(参见 参考资料)了解更多可能性,包括边界、页边、填充、颜色、图像和表。


结束语

从一个 XML 文件生成一份简历或履历需要一些额外工作,但能应用一种经过规范的结构,该结构能够帮助确保文档的复杂度满足需求。

使用文本编辑器创建文档仍然是简单场景中的一种有效手段。但是,使用一个 XML 文件作为不同简历版本的公共信息源则适合更复杂的数据源。我们将面临在两种选择之间进行抉择:是在一个编辑器中维护一个文档及其标记的多个副本效率高呢还是维护在同一数据上操作的多个样式表高效?这两种选择都将实现相同的结果,但采用的路径不同。

参考资料

学习

  • 小心使用 XML 名称空间(Uche Ogbuji,developerWorks,2004 年 4 月):了解使用名称空间的一些困难,减少在 XML 设计中包含名称空间时遇到的问题。
  • 技巧:用 XSLT 样式表控制文档中的空白(Nicholas Chase,developerWorks,2002 年 11 月):理解转换过程中的空白和空格剥离,创建您想要的文档。
  • 改进 XSLT 编码的五种方法(Benoît Marchal,developerWorks,2001 年 1 月):在转换过程中添加 5 种有用的技术:联用 CSS 和 XSL 样式表、使用 HTML 实体、包含客户端 JavaScript、使用多个输入文档、以及使用 XSLT 自动生成样式表。
  • 开放式应用程序组集成规范(Michael Rowell,developerWorks,2003 年 6 月):了解 OAGIS 标准的工作方式。
  • Apache FOP:深入了解这个由 XSL 格式化对象(XSL-FO)和一个输出独立的格式化程序驱动的打印格式化程序。
  • Apache FOP Compliance Page:访问此页面,探索 FOP 文档中的格式化可能性。
  • HR-XML:这是一个 HR-XML 实现工具。
  • Open Applications Group:访问这个标准开发组织的网站,该组织为电子商务、云计算、面向服务架构、web 服务和企业集成构建基于流程的业务标准。
  • OASIS:了解 Organization for the Advancement of Structured Information Standards 的更多相关信息。
  • XSL:深入研究这些用于定义 XML 文档转换和呈现的建议。
  • 本文作者的更多文章(Colin Beckingham,developerWorks,2009 年 3 月至今):阅读关于 XML、语音识别、XHTML、PHP、SMIL 和其他技术的文章。
  • developerWorks XML 专区:在 XML 专区获取提高您的专业技能所需的资源。
  • developerWorks 中文社区:个性化您的 developerWorks 体验。
  • IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 和相关技术的开发人员。
  • XML 技术库:访问 developerWorks XML 专区,获得广泛的技术文章和技巧、教程、标准和 IBM 红皮书,并阅读关于 XML 技巧 的更多信息。
  • developerWorks 技术活动网络广播:随时关注这些活动中的技术。
  • developerWorks 播客:收听面向软件开发人员的有趣访谈和讨论。
  • 观看 developerWorks 演示中心,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Open source
ArticleID=629723
ArticleTitle=向简历添加 XML 结构
publish-date=02282011