2009-04-10 53 views
0

我需要將很多XML文件(Fedora導出)轉換爲不同類型的XML。嘗試使用XSL樣式表並使用msxsl轉換器進行檢查。用XSL過濾大部分XML嗎?

按說我有這樣的XML文件(假設實際上裏面有AAA,OBJ,AMD所有其他節點的其他節點),Source.XML:我需要看起來像這樣(目標

<DOC> 
<AAA> 
    <STUFF>example</STUFF> 
    <OBJ> 
     <OBJVERS id="A1" CREATED="2008-02-18T13:28:08.245Z"/> 
     <OBJVERS id="A2" CREATED="2008-02-19T10:42:41.965Z"/> 
     <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/> 
    </OBJ> 
</AAA> 
<FFF/> 
<GGG/> 
<DDD> 
    <FILE /> 
</DDD> 
</DOC> 

.XML):

<MYOBJ> 
     <ELEM>contents of OBJVERS with the biggest id OR 
creation date (whichever is easier to do) go here</ELEM> 
     <IMAGE> contents of <FILE> node go here</IMAGE> 
    </MYOBJ> 

主要的問題,我有是,由於我是新來的XSL(和這個特殊的任務沒有足夠的時間去好好學學吧)是我無法理解如何告訴XSL處理器不要處理其他任何事情,例如,我一直在收到輸出。

更新:基本上,我同時解決了這個問題。我會發布我自己的答案並結束這個問題。

Update2:好的,安德魯的答案也適用,所以我只是接受它。 :)

+0

-1。 Stackoverflow並不是一個可以說RTFM的地方,但你基本上只是要求社區爲你寫代碼,如果你閱讀了免費的文檔,你可以編寫代碼。所以,詳細一點 - 你有什麼問題? – Elijah 2009-04-10 15:37:17

+0

好吧。我在來這裏之前閱讀了RTFM,但還好,夠公平的......我會解釋更多。 – Gnudiff 2009-04-10 15:38:56

回答

2

這個問題已經制定了非常鬆散,這是不是提供一個更有意義的解決方案有幫助。

這就是說,下面的轉型

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
     <MYOBJ> 
     <ELEM> 
      <xsl:for-each select="/*/AAA/OBJ/OBJVERS"> 
      <xsl:sort select="@CREATED" order="descending"/> 

      <xsl:if test="position() = 1"> 
       <xsl:copy-of select="."/> 
      </xsl:if> 
      </xsl:for-each> 
     </ELEM> 

     <IMAGE> 
      <xsl:copy-of select="/*/DDD/FILE"/> 
     </IMAGE> 
     </MYOBJ> 
    </xsl:template> 
</xsl:stylesheet> 

當上了人工和做作提供的XML文檔應用(其實有壞結構和命名,並違背了設計XML文檔的許多原則):

<DOC> 
    <AAA> 
     <STUFF>example</STUFF> 
     <OBJ> 
      <OBJVERS id="A1" CREATED="2008-02-18T13:28:08.245Z"/> 
      <OBJVERS id="A2" CREATED="2008-02-19T10:42:41.965Z"/> 
      <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/> 
     </OBJ> 
    </AAA> 
    <FFF/> 
    <GGG/> 
    <DDD> 
     <FILE /> 
    </DDD> 
</DOC> 

生產什麼人能猜出是通緝的結果

<MYOBJ> 
    <ELEM> 
     <OBJVERS id="A13" CREATED="2009-03-16T12:43:11.703Z"/> 
    </ELEM> 
    <IMAGE> 
     <FILE/> 
    </IMAGE> 
</MYOBJ> 
0

這不是完整的解決方案,因爲它不會在選擇第一個之前對OBJVERS進行排序。但是如果你能解決選擇正確的OBJVERS的問題,那麼我認爲這將會完成剩下的工作。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml"/> 
<xsl:template match="/"> 
    <MYOBJ> 
     <xsl:for-each select="/DOC/AAA/OBJ/OBJVERS[position()==1]"> 
      <ELEM><xsl:copy-of select="*"/></ELEM> 
     </xsl:for-each> 
     <IMAGE><xsl:copy-of select="/DOC/DDD/FILE/*" /></IMAGE> 
    </MYOBJ> 
</xsl:template> 
+0

XPath中沒有「==」運算符。即使在編譯階段,任何兼容的XSLT處理器都會引發錯誤。這個答案根本不能解決問題。 – 2009-04-10 16:35:53