我使用PHP以XML格式(SimpleXML)對元數據進行索引。在過程中(以及稍後的一些時間),我想通過屬性/位置/名稱來重寫(和刪除)元素。我想這個xslt對於這樣做是有好處的,但是由於性能我感到有點可怕。所以它可能會更好地形成一個規則正則表達式和編輯直接與PHP?對於這些替代我不喜歡,我無法找到一個操作語法,進一步幫助我。XML的同義詞替換XML中的xslt元素有意義?
那麼你如何做或將做到這一點? 感謝您的幫助, 羅伯特
我使用PHP以XML格式(SimpleXML)對元數據進行索引。在過程中(以及稍後的一些時間),我想通過屬性/位置/名稱來重寫(和刪除)元素。我想這個xslt對於這樣做是有好處的,但是由於性能我感到有點可怕。所以它可能會更好地形成一個規則正則表達式和編輯直接與PHP?對於這些替代我不喜歡,我無法找到一個操作語法,進一步幫助我。XML的同義詞替換XML中的xslt元素有意義?
那麼你如何做或將做到這一點? 感謝您的幫助, 羅伯特
我懷疑它是在一般情況下可以用正則表達式刪除以表達/添加/ 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>
非常感謝您的示例。我已經在simpleXML中使用過xslt了。正如我在上面評論中提到的那樣,當在更高層次中迭代時,使用xslt交換DOM中的節點並不穩定。您可能是正確的,xslt工作正常。 – rokdd
@rokdd:XSLT被設計爲XML轉換的語言。它提供了簡單和優雅,同時也非常強大。絕對是一個在其工具集中佔有一席之地的工具。 –
正則表達式不擅長操作XML。使用XSLT,爲什麼性能應該是可怕的? –
,因爲如果必須轉換成DOM對象,因爲它經常被調用(不止一次),並且因爲simplexml/DOM交換中存在錯誤。所以如果我在simpleXML中迭代並將節點的一部分轉換爲DOM並轉換返回(使用導入函數)迭代被取消,因爲對象不知何故不相同。 – rokdd
好問題,+1。查看我的答案,獲得一個完整,簡單,簡單,易用的XSLT解決方案。每當需要轉換XML文檔時,在解決此問題時不使用XSLT將是一個嚴重錯誤。 –