2011-04-20 249 views
4

我有一些問題使用Xpath獲取所有沒有<script><script ... />的html標籤。XPATH獲取所有標籤<script>和</script>標籤

例如,在HTML代碼中的這一部分,我想刪除:

<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=fr"/> 

此代碼

<li><!-- Search Google --> 
<center> 
        <form action="http://www.google.fr/cse" id="cse-search-box" target="_blank"> 
         <div> 
          <input type="hidden" name="cx" value="partner-pub-0959382714089534:mw3ssl65jk1"/> 
          <input type="hidden" name="ie" value="ISO-8859-1"/> 
          <input type="text" name="q" size="31"/> 
          <input type="submit" name="sa" value="Rechercher"/> 
         </div> 
        </form> 
        <script type="text/javascript" 
          src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=fr"/> 
        </center> 
        <!-- Search Google --></li> 

我生成使用Web-收穫一個XML文件,那麼我必須刪除一些特定的標籤。 我已經嘗試了很多的XPath(我在HTML的主體工作):

  • //body//*[not(name() = 'script')]

  • //body//*[not(self::script)]

  • //body//*[not(starts-with(name(),'script'))]

  • //body//*[not(contains(name(),'script'))]

但它不工作。

注意//body//*[name() = 'script']工作,但我想相反...

你有一些想法?

或者更generaly,如果你知道如何刪除使用XPath所有<script><script/>標籤,我也是提前

感謝:-)興趣。

+0

好問題,+1。請參閱我的答案,解釋爲什麼僅使用XPath和完整,簡短且容易的XSLT解決方案無法實現此目的。 :) – 2011-04-21 02:54:20

回答

3

那麼首先XPath選擇現有文檔中的節點,但不會刪除它們。而你的路徑//body//*首先選擇body元素的所有子元素和後代元素。即使現在添加謂詞//body//*[not(self::script)],該路徑仍會選擇元素,如licenter元素,但它們本身不是script元素,但包含script元素。因此,//body//*[not(self::script)]是不選擇任何非script元素的正確方法,但是如果您想要例如原始center元素與script元素被刪除,則無效。這不是純XPath可以爲您做的事情,您需要移至XSLT以轉換文檔,並以此方式刪除任何script元素。

+0

+1正確答案。這屬於XSLT範圍。 – 2011-04-20 23:08:24

3

的XPath僅僅是一個查詢語言XML文檔,因此它不能以任何方式改變被查詢的XML文檔(或多個)

生成與最初的XML文檔不同的新XML文檔的最方便的方法是使用XSLT。

這種短期和簡單的XSLT轉換

<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="script"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<li> 
    <!-- Search Google --> 
    <center> 
     <form action="http://www.google.fr/cse" 
       id="cse-search-box" target="_blank"> 
      <div> 
       <input type="hidden" name="cx" 
       value="partner-pub-0959382714089534:mw3ssl65jk1"/> 
       <input type="hidden" name="ie" value="ISO-8859-1"/> 
       <input type="text" name="q" size="31"/> 
       <input type="submit" name="sa" value="Rechercher"/> 
      </div> 
     </form> 
     <script type="text/javascript" 
     src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=fr"/> 
    </center> 
    <!-- Search Google --> 
</li> 

產生想要的,正確的結果

<li><!-- Search Google --> 
    <center> 
     <form action="http://www.google.fr/cse" id="cse-search-box" target="_blank"> 
     <div> 
      <input type="hidden" name="cx" value="partner-pub-0959382714089534:mw3ssl65jk1"/> 
      <input type="hidden" name="ie" value="ISO-8859-1"/> 
      <input type="text" name="q" size="31"/> 
      <input type="submit" name="sa" value="Rechercher"/> 
     </div> 
     </form> 
    </center><!-- Search Google --> 
</li>