从外部文档获取数据

时间:2014-05-05 07:26:16

标签: xml xslt xslt-2.0

我有以下xml文件

XML1:

<chapter num="01">
<title><page num="1"/><content-style font-style="bold">INTRODUCTION</content-style></title>
<chapter-meta><author><name><firstname>YEO</firstname><middlename>HWEE</middlename><surname>YING</surname></name></author></chapter-meta>
</chapter>

XML2:

<chapter num="02">
<title><page num="35"/><content-style font-style="bold">INCORPORATION AND ITS CONSEQUENCES</content-style></title>
<chapter-meta><author><name><firstname>TAN</firstname><middlename>CHENG</middlename><surname>HAN</surname></name></author></chapter-meta>
</chapter>

XML3:

<chapter num="03">
<title><page num="78"/><page num="79"/><content-style font-style="bold">CORPORATE PERSONALITY</content-style></title>
<chapter-meta><author><name><firstname>TAN</firstname><middlename>CHENG</middlename><surname>HAN</surname></name></author></chapter-meta>
</chapter>

,主XML文件是

<main>
<toc-item>
<toc-title>CHAPTER 1 INTRODUCTION</toc-title>
</toc-item>
<toc-item>
<toc-title>CHAPTER 2 INCORPORATION AND ITS CONSEQUENCES</toc-title>
</toc-item>
<toc-item>
<toc-title>CHAPTER 3 CORPORATE PERSONALITY</toc-title>
</toc-item>
</main>

这里我需要将章节编号与xml文件(xml1,xml2,xml3)中的章节编号进行比较,并显示作者姓名。预期产出如下。

Chapter 1: YEO HWEE YING
Chapter 2: TAN CHENG HAN
Chapter 3: TAN CHENG HAN

我已尝试过以下代码。

  <xsl:variable name="pg">
                                     <xsl:value-of select="document('C:\Users\u0138039\Desktop\Proview\SG\Commentary_SG_XML-03032014\SG-Walter Woon on Company Law (3rd ed)/title.xml')/entry/file/translate(translate(./@name,'Walter Woon on Company Law (3rd ed)_Chapter',''),'.x  ','')"/>                                                                              </xsl:variable>
                            <xsl:value-of select="$Chapn=$pg"/>

这里我创建了一个包含所有章节名称的XML文件,并将其放在文档元素中。在这里,当我尝试打印输出时,它显示我false

请让我知道如何做到这一点。

由于

1 个答案:

答案 0 :(得分:1)

对于大多数XSLT 2.0处理器,您可以使用collection函数从文件系统访问文件集合,但具体语法取决于XSLT处理器。使用Saxon 9,以下内容适用于我:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="chapters" select="collection('.?select=XML*.xml')/chapter"/>

<xsl:template match="toc-item/toc-title">
  <xsl:analyze-string select="." regex="chapter\s+([0-9]+)\s+" flags="i">
    <xsl:matching-substring>
      <xsl:value-of select="."/>
      <xsl:value-of select="$chapters[xs:integer(@num) eq xs:integer(regex-group(1))]/chapter-meta/author/name/*"/>
      <xsl:text>&#10;</xsl:text>
    </xsl:matching-substring>
  </xsl:analyze-string>
</xsl:template>

</xsl:stylesheet>

将三个文件XML1.xmlXML2.xmlXML3.xml放在与主输入相同的工作目录中,然后输出

CHAPTER 1 YEO HWEE YING
CHAPTER 2 TAN CHENG HAN
CHAPTER 3 TAN CHENG HAN

使用AltovaXML 2013版本,以下内容适用于我:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">

<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="chapters" select="collection('./XML*.xml')/chapter"/>

<xsl:template match="toc-item/toc-title">
  <xsl:analyze-string select="." regex="chapter\s+([0-9]+)\s+" flags="i">
    <xsl:matching-substring>
      <xsl:value-of select="."/>
      <xsl:value-of select="$chapters[xs:integer(@num) eq xs:integer(regex-group(1))]/chapter-meta/author/name/*"/>
      <xsl:text>&#10;</xsl:text>
    </xsl:matching-substring>
  </xsl:analyze-string>
</xsl:template>

</xsl:stylesheet>

我不知道collection的使用是否适用于名为Raptor of Altova的XSLT引擎的最新版本,我无法访问它们,因为他们不会这样做; t不再提供开发人员版本或许可证,http://manual.altova.com/RaptorXML/raptorxmlserver/似乎不包含collection使用的文档,至少在快速浏览时是这样。