2012-06-01 49 views
4

我是XSL的新手,無法找到關於此問題的信息。這僅適用於XSLT 1.0,最終將從XSLTproc運行。XSLT XML到XML如果特定的子項不存在,則刪除節點

下面是一個例子XML

<root> 
    <node> 
     <data /> 
     <child> 
      <grandchild /> 
     </child> 
     <step-child action="removenode" /> 
    </node> 
    <node> 
     <data /> 
     <step-child action="removenode" /> 
    </node> 
</root> 

基本上,我希望把一切都只是:

  • 刪除任何節點沒有<child>
  • 刪除所有<step-child>

我只能弄清楚如何刪除不需要的節點,bu即使這是可疑的。我非常感謝任何幫助。

+0

我試圖擺脫一些教授在某處建議他或她的學生他們使用SO作爲免費完成作業的方式的感覺。這些絕對不是現實世界的問題,而且非常簡單。我擔心通過爲他們做這些人的功課,我們會剝奪他們自己學習XSLT或通過瀏覽可用資源的過程。至少,我們不應該提供功能完善的XSLT程序,而只是給他們原則,或者將他們指向某個地方。 – 2012-06-02 01:43:39

+0

重複的http://stackoverflow.com/questions/321860/how-to-remove-elements-from-xml-using-xslt-with-stylesheet-and-xsltproc以及許多其他許多人。 – 2012-06-02 01:48:49

+0

我對torazaburo非常同情:我總是喜歡專注於幫助提問者克服特定的困難,以便他們可以爲自己解決問題,而不是給他們一個工作的答案。很顯然,與其他許多人一樣,TechZilla正試圖跳過一個學習新語言的階段:你不是從解決某個特定問題開始,而是從廣泛閱讀語言的本質及其一般方法解決問題。 –

回答

10
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <!--Identity template to copy all content by default--> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!--Remove node elements that do not have child elements, 
       and remove step-child elements --> 
    <xsl:template match="node[not(child)] | step-child"/> 

</xsl:stylesheet> 
+0

Downvoting表示不滿意爲人們做簡單的作業問題的概念。 – 2012-06-02 01:49:41

+5

@torazaburo:如果是這樣,那麼請降低問題 - 而不是答案 - 尤其不是一個好答案。 –

+1

@torazaburo:這不是家庭作業,我是一個Linux系統管理員,他對XSLT有點新鮮,使用自動配置。順便說一句,實際問題甚至比我所問的還要多,這只是我自己有麻煩的部分。 – TechZilla