2013-02-07 149 views
1

我要去從那裏取一些數據,即this XML文件的結構轉換到另一個(新的元素名稱)另一個XML:的轉換XML結構使用XSLT和PHP

  1. 價值所有元素;
  2. 所有元素的值和元素的元素;

我剛開始玩XSLT並且知識薄弱,所以不要嚴格判斷我。我transform.xsl模板(不打印的XML元素名):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="/RESPONSE/MULTIPLE/SINGLE/KEY" /> 
    </xsl:template> 

    <!-- transformation to another xml file --> 
    <xsl:template match="/MULTIPLE"> 
    <course> 
    <xsl:for-each select="SINGLE"> 
     <topic> 
      <!-- Updated --> 
      <chapter><xsl:value-of select="KEY[@name='name']/VALUE" /></chapter> 
      <xsl:for-each select="KEY[@name='modules']/MULTIPLE/SINGLE"> 
       <title><xsl:value-of select="KEY[@name='name']/VALUE" /></title> 
       <content><xsl:value-of select="KEY[@name='description']/VALUE" /></content> 
      </xsl:for-each> 
      <!-- /Updated --> 
     </topic> 
    </xsl:for-each> 
    </course> 
</xsl:template> 

預計stucture爲[更新]:

<?xml version="1.0" encoding="UTF-8"?> 
<course> 
    <topic> 
     <chapter>Chapter Name 1</chapter> 
     <title>Title Name 1</title> 
     <content>Content 1</content> 
    </topic> 
    <!-- Updated --> 
    <topic> 
     <chapter>Chapter Name 1</chapter> <!-- print for each <title> and <content> --> 
     <title>Title Name 2</title> 
     <content>Content 2</content> 
    </topic> 
    <topic> 
     <chapter>Chapter Name n</chapter> 
     <title>Title Name n</title> 
     <content>Content n</content> 
    </topic> 
    <!-- Updated --> 
    ... 
</course> 

PHP程序:

$xml = new DOMDocument; 
$xml->load("http://dl.dropbox.com/u/72519118/response.xml"); 

$xsl = new DOMDocument; 
$xsl->load("transform.xsl"); 

// Configure the transformer 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl); 

echo $proc->transformToXML($xml); 

任何幫助,將不勝感激。

回答

1

謝謝你提出的問題。你在正確的軌道上,但也有一些問題:

既然你想模板應用到頂級的倍數,你的第一個apply-templates應該是這樣的:

<xsl:apply-templates select="/RESPONSE/MULTIPLE" /> 

由於MULTIPLE是不是根元素,如果匹配元素值以斜槓開始,則第二個模板將不匹配任何內容。這是你應該使用什麼:

<xsl:template match="MULTIPLE"> 

而且當你要對一個字符串值進行比較的東西(屬性,元素等),你需要把引號圍繞價值:

<xsl:value-of select="KEY[@name = 'name']/VALUE" /> 

一旦這些元素是固定的,你得到這個XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="/RESPONSE/MULTIPLE" /> 
    </xsl:template> 

    <!-- transformation to another xml file --> 
    <xsl:template match="MULTIPLE"> 
    <course> 
     <xsl:for-each select="SINGLE"> 
     <topic> 
      <chapter> 
      <xsl:value-of select="KEY[@name = 'name']/VALUE" /> 
      </chapter> 
      <title> 
      <xsl:value-of 
       select="KEY[@name= 'modules']/MULTIPLE/SINGLE/KEY 
             [@name = 'name']/VALUE" /> 
      </title> 
      <content> 
      <xsl:value-of 
       select="KEY[@name= 'modules']/MULTIPLE/SINGLE/KEY 
           [@name ='description']/VALUE" /> 
      </content> 
     </topic> 
     </xsl:for-each> 
    </course> 
    </xsl:template> 
</xsl:stylesheet> 

這裏是一個更新的版本,以滿足您的要求澄清:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 
    <xsl:template match="/"> 
    <course> 
     <xsl:apply-templates 
     select="/RESPONSE/MULTIPLE/SINGLE/KEY[@name = 'modules']/MULTIPLE/SINGLE" /> 
    </course> 
    </xsl:template> 

    <xsl:template match="SINGLE"> 
    <topic> 
     <chapter> 
     <xsl:value-of select="../../../KEY[@name = 'name']/VALUE" /> 
     </chapter> 
     <title> 
     <xsl:value-of select="KEY[@name = 'name']/VALUE" /> 
     </title> 
     <content> 
     <xsl:value-of select="KEY[@name ='description']/VALUE" /> 
     </content> 
    </topic> 
    </xsl:template> 
</xsl:stylesheet> 

請注意,這只是將模板應用於所有二級<SINGLE> s。爲了獲取章節名稱,它將備份XML樹以從父節點獲取該值。

當您的源XML運行輸出是:

<course> 
    <topic> 
    <chapter>General</chapter> 
    <title>News forum</title> 
    <content></content> 
    </topic> 
    <topic> 
    <chapter>ANATOMIE</chapter> 
    <title>1.1 Die Haut</title> 
    <content> 
     &lt;div class="no-overflow"&gt;&lt;p&gt;&lt;span class="nolink"&gt;&lt;img src="http://localhost/pluginfile.php/22/mod_page/intro/die_haut.png" width="auto" style="border: 1px  [SNIP] 
    </content> 
    </topic> 
    <topic> 
    <chapter>ANATOMIE</chapter> 
    <title>1.2 Der Schädel Page</title> 
    <content> 
     &lt;div class="no-overflow"&gt;&lt;h3&gt;1.2 Der Schädel&lt;/h3&gt; 
     [SNIP] 
    </content> 
    </topic> 
    <topic> 
    <chapter>ANATOMIE</chapter> 
    <title>1.6 Die Regelkreise</title> 
    <content> 
     &lt;div class="no-overflow"&gt;&lt;h3&gt;1.6 Die Regelkreise&lt;/h3&gt; 
     [SNIP] 
    </content> 
    </topic> 
    <topic> 
    <chapter>ANATOMIE</chapter> 
    <title>Media</title> 
    <content></content> 
    </topic> 
    <topic> 
    <chapter>NOTFÄLLE</chapter> 
    <title>2.1 Neurologische Notfälle</title> 
    <content></content> 
    </topic> 
    <topic> 
    <chapter>NOTFÄLLE</chapter> 
    <title>2.5 Krampfanfälle</title> 
    <content></content> 
    </topic> 
    <topic> 
    <chapter>NOTFÄLLE</chapter> 
    <title>2.9 Pulmonale Notfälle</title> 
    <content></content> 
    </topic> 
    <topic> 
    <chapter>STÖRUNGEN</chapter> 
    <title>3.1 Störungen der Lebensfunktionen bei Erwachsenen (ab der Pubertät)</title> 
    <content></content> 
    </topic> 
    <topic> 
    <chapter>STÖRUNGEN</chapter> 
    <title>3.16 Störungen der Lebensfunktionen bei Säuglingen (bis ein Jahr) und Kindern (bis zur Pubertät)</title> 
    <content></content> 
    </topic> 
    <topic> 
    <chapter>STÖRUNGEN</chapter> 
    <title>3.25 Starke Blutung</title> 
    <content></content> 
    </topic> 
</course> 
+0

非常感謝,這是我真正想要的東西。另外一個問題是爲了考慮我將來使用xml處理的過程,我知道有很多方法和解決方案,但是對於像上面這樣的情況,轉換(解析)的最佳解決方案是什麼?順便說一下,上面提到的response.xml是簡化版本,通常它大約是10-30 Mb文件,當然我想使用該解決方案,這是轉換或解析此類xml文件中速度最快的解決方案。預先感謝您 – Dozent

+0

忘了提及,您提出的方法是隻採用每個** **元素的第一** **單元,如果您查看原始的response.xml也是其他單元素(意味着每章可能有兩個或更多的主題)。我應該在上面的元素之前添加另一個for?或者? – Dozent

+0

就性能而言,我認爲上述任何一種解決方案都應該大致相同,因爲它們都非常簡單。關於在'modules'組下面處理多個'SINGLES',從你的例子中不清楚你想如何在輸出XML中表示,那麼你能解釋一下嗎?你能否舉一個這樣的結果應該看起來如何的例子?我現在要睡覺了,但一旦你澄清了這一點,我可以在大約7小時內更新我的答案。 – JLRishe