2011-11-03 137 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>