2011-06-19 62 views
0

我使用PHP以XML格式(SimpleXML)對元數據進行索引。在過程中(以及稍後的一些時間),我想通過屬性/位置/名稱來重寫(和刪除)元素。我想這個xslt對於這樣做是有好處的,但是由於性能我感到有點可怕。所以它可能會更好地形成一個規則正則表達式和編輯直接與PHP?對於這些替代我不喜歡,我無法找到一個操作語法,進一步幫助我。XML的同義詞替換XML中的xslt元素有意義?

那麼你如何做或將做到這一點? 感謝您的幫助, 羅伯特

+0

正則表達式不擅長操作XML。使用XSLT,爲什麼性能應該是可怕的? –

+0

,因爲如果必須轉換成DOM對象,因爲它經常被調用(不止一次),並且因爲simplexml/DOM交換中存在錯誤。所以如果我在simpleXML中迭代並將節點的一部分轉換爲DOM並轉換返回(使用導入函數)迭代被取消,因爲對象不知何故不相同。 – rokdd

+0

好問題,+1。查看我的答案,獲得一個完整,簡單,簡單,易用的XSLT解決方案。每當需要轉換XML文檔時,在解決此問題時不使用XSLT將是一個嚴重錯誤。 –

回答

2

我懷疑它是在一般情況下可以用正則表達式刪除以表達/添加/ XML文檔中的任意深度替換操作的節點(更不用提同時滿足其他條件,如基於屬性,名稱空間,深度,文本節點)。

這解釋了爲什麼你找不到任何這樣的RegEx。

另一方面,任何這樣的操作對於XSLT來說都是微不足道的,一個人在半分鐘內寫出解決方案,並忘記了這個「問題」,因爲有更重要的事情要做。

對於記錄,下面是一個元素重命名操作(名爲a艾米元件被重命名爲h):

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

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="a"> 
    <h> 
    <xsl:apply-templates/> 
    </h> 
</xsl:template> 
</xsl:stylesheet> 

當應用於例如此XML文檔

<a> 
    <b> 
     <c> 
      <d/> 
      <a> 
       <b> 
        <e> 
         <f> 
          <c> 
           <d> 
            <a/> 
           </d> 
          </c> 
         </f> 
        </e> 
       </b> 
      </a> 
     </c> 
    </b> 
</a> 

想要的,正確的結果產生

<h> 
    <b> 
     <c> 
     <d/> 
     <h> 
      <b> 
       <e> 
        <f> 
        <c> 
         <d> 
          <h/> 
         </d> 
        </c> 
        </f> 
       </e> 
      </b> 
     </h> 
     </c> 
    </b> 
</h> 
+0

非常感謝您的示例。我已經在simpleXML中使用過xslt了。正如我在上面評論中提到的那樣,當在更高層次中迭代時,使用xslt交換DOM中的節點並不穩定。您可能是正確的,xslt工作正常。 – rokdd

+1

@rokdd:XSLT被設計爲XML轉換的語言。它提供了簡單和優雅,同時也非常強大。絕對是一個在其工具集中佔有一席之地的工具。 –