2011-11-03 228 views
-1

我必须使用xslt 1.0合并两个xml文档。每个XML文档都有一些文章标题和出版日期合并成一个。条件是新的XML文档中的文章应按日期升序排序。 以下是文档样本: doc1.xml 僵局移动 05-05/2002 一些文本 反犹太主义在欧洲 12-05/2002 一些文字 如何将两个XML文档合并为一个XML文档?

而且doc2.xml文件是

<document> 
    <article> 
    <head>Launch Year A Success For Alliance</head> 
    <text> 
     <paragraph>para text</paragraph> 
     <paragraph>para text</paragraph> 
     <paragraph>para text</paragraph> 
    </text> 
    <date> 
     <day>17</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    <source>Alliance</source> 
    <portal>Finance</portal> 
    <ID number="27"/> 
    </article> 
    <article> 
    <head>ISA Savers Could Lose Tax Relief</head> 
    <text> 
     <paragraph>para text</paragraph> 
     <paragraph>para text</paragraph> 
     <paragraph>para text</paragraph> 
     <paragraph>para text</paragraph> 
    </text> 
    <date> 
     <day>10</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    <source>Money</source> 
    <portal>Finance</portal> 
    <ID number="26"/> 
    </article> 
</document> 

和所需的输出是:

<document> 
    <article> 
<head>The logjam moves</head> 
     <date> 
    <day>05</day> 
    <month>05</month> 
    <year>2002</year> 
</date> 
    <text>Some text </text> 
    </article> 
    <article> 
<head>ISA Savers Could Lose Tax Relief</head> 
<text> para text para text para text para text </text> 
<date> 
    <day>10</day> 
    <month>05</month> 
    <year>2002</year> 
    </date> 
    </article> 
    <article> 
<head>Anti-Semitism in Europe</head> 
    <date> 
    <day>12</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    <text>some more text</text> 
    </article> 
    <article> 
    <head> Launch Year A Success For Alliance </head> 
    <text> para text para text para text para text  </text> 
    <date> 
     <day>17</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    </article> 
</document> 

而且我的样式表是:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="doc1File">doc1.xml</xsl:param> 
    <xsl:variable name="doc1" select="document($doc1File)" as="document-node()"/> 
    <xsl:param name="doc2File">doc2.xml</xsl:param> 
    <xsl:variable name="doc2" select="document($doc2File)" as="document-node()"/> 
    <xsl:template match="/"> 
    <xsl:for-each select ="$finance/document/article"> 
     <xsl:value-of select="head"/> 
     <xsl:value-of select="text"/> 
     <xsl:value-of select="date"/> 
    </xsl:for-each> 
    <xsl:for-each select ="$economist/document/ARTICLE"> 
     <xsl:value-of select="headline"/> 
     <xsl:value-of select="text"/> 
     <xsl:value-of select="date"/> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

正如你所看到的,我只能够打印元素的值。我找不出来

  1. 如何解析不同提到的日期doc1.xml和
  2. 合并两个文件,整理自己的出版日期

请帮助。提前致谢。

回答

0

我有一个解决方案给你。您需要将问题分解成几个步骤。

首先是规范化你正在导入的数据,这样当你合并和排序 你有一个类似结构的元素。

第二个是然后选择和那些规范化的文件进行排序。

要做到这一点,我已经使用了多种模式,以分离出各种变换( 你会发现它更容易只是确保你的源文件都是相同的格式 开始)。在这一点上,你不想在导入的文档的“/”上匹配 - 否则你最终会应用我们用来进行合并的'/'匹配。

一旦你的数据足够规范化,排序变得 相对简单。

问候

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:exsl="http://exslt.org/common" 
            extension-element-prefixes="exsl"> 

     <xsl:param name="doc1File">./doc1.xml</xsl:param> 
     <xsl:param name="doc2File">./doc2.xml</xsl:param> 

     <xsl:variable name="doc1"> 
      <xsl:apply-templates select="document($doc1File)/*" mode="import1"/> 
     </xsl:variable> 
     <xsl:variable name="doc2"> 
      <xsl:apply-templates select="document($doc2File)/*" mode="import2"/> 
     </xsl:variable> 

     <!-- merging and sorting --> 
     <xsl:template match="/"> 
      <document> 
       <xsl:apply-templates select=" 
        exsl:node-set($doc1)/document/article| 
        exsl:node-set($doc2)/document/article"> 
        <xsl:sort select="date/year"/> 
        <xsl:sort select="date/month"/> 
        <xsl:sort select="date/day"/> 
       </xsl:apply-templates> 
      </document> 
     </xsl:template> 

     <xsl:template match="article"> 
      <xsl:copy> 
       <xsl:apply-templates select="head|text|date"/> 
      </xsl:copy> 
     </xsl:template> 

     <xsl:template match="*"> 
      <xsl:copy> 
       <xsl:copy-of select="@*"/> 
       <xsl:apply-templates/> 
      </xsl:copy> 
     </xsl:template> 

     <!-- transforming document 1 --> 
     <xsl:template match="ARTICLE" mode="import1"> 
      <article> 
       <head><xsl:value-of select="headline"/></head> 
       <date> 
        <day><xsl:value-of select="substring(date,1,2)"/></day> 
        <month><xsl:value-of select="substring(date,4,2)"/></month> 
        <year><xsl:value-of select="substring(date,7,4)"/></year> 
       </date> 
       <xsl:apply-templates select="text" mode="import1"/> 
      </article> 
     </xsl:template> 

     <xsl:template match="*" mode="import1"> 
      <xsl:copy> 
       <xsl:copy-of select="@*"/> 
       <xsl:apply-templates mode="import1"/> 
      </xsl:copy> 
     </xsl:template> 

    <!-- transforming document 2 --> 

     <xsl:template match="text" mode="import2"> 
      <xsl:copy> 
       <xsl:copy-of select="@*"/> 
       <xsl:apply-templates select="paragraph" mode="import2"/> 
      </xsl:copy> 
     </xsl:template> 
     <xsl:template match="paragraph" mode="import2"> 
      <xsl:choose> 
       <xsl:when test="position() != last()"> 
        <xsl:value-of select="normalize-space(.)"/><xsl:text> </xsl:text> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="normalize-space(.)"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:template> 

     <xsl:template match="*" mode="import2"> 
      <xsl:copy> 
       <xsl:copy-of select="@*"/> 
       <xsl:apply-templates mode="import2"/> 
      </xsl:copy> 
     </xsl:template> 

    </xsl:stylesheet> 

我的结果是

<?xml version="1.0"?> 
<document> 
    <article> 
    <head>The logjam moves</head> 
    <date> 
     <day>05</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    <text>Some text </text> 
    </article> 
    <article> 
    <head>ISA Savers Could Lose Tax Relief</head> 
    <text>para text para text para text para text</text> 
    <date> 
     <day>10</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    </article> 
    <article> 
    <head>Anti-Semitism in Europe</head> 
    <date> 
     <day>12</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    <text>some more text</text> 
    </article> 
    <article> 
    <head>Launch Year A Success For Alliance</head> 
    <text>para text para text para text</text> 
    <date> 
     <day>17</day> 
     <month>05</month> 
     <year>2002</year> 
    </date> 
    </article> 
</document> 
相关问题