我有以下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
。
请让我知道如何做到这一点。
由于
答案 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> </xsl:text>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
将三个文件XML1.xml
,XML2.xml
,XML3.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> </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
使用的文档,至少在快速浏览时是这样。