2011-04-20 191 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>