Use o programa xsltproc
que você terá no OSX, man xsltproc
Por exemplo:
$ cat remdivs.xslt
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:preserve-space elements="html body div" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="div[@class='block highlight']"/>
</xsl:stylesheet>
$ cat input.xml
<html>
<div class="block highlight">
Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
<span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&session_id=1523141136.42&data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2000976405029%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e21%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e000035010005%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 339 "-" "-"
</span><br>
</div>
<div class="no highlight">
Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
<span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&session_id=1523141136.42&data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2001021500003%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e1%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e501302462%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 349 "-" "-"
</span><br>
</div>
<div class="block highlight">
Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
<span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:50:17 +0200] "GET /thestring//index.php?fnc=OSCExportCatalog&session_id=3214235353.32&onlynew=y HTTP/1.1" 200 676 "-" "-"
</span><br>
</div>
</html>
$ xsltproc --html remdivs.xslt input.xml
<html>
<body>
<div class="no highlight">
Reason: <span class="reason">Detects JavaScript location/document property access and window access obfuscation</span><br>
<span class="line"><b>Log line: </b>111.222.333.444 - - [03/Jan/2013:00:45:40 +0200] "GET /thestring//index.php?fnc=OSCImportStock&session_id=1523141136.42&data=%3cARTICLE_ITEM%3e%3cARTICLE_ITEM_ID%3e2001021500003%3c%2fARTICLE_ITEM_ID%3e%3cQUANTITY%3e1%3c%2fQUANTITY%3e%3cDELIVERY_DATE%2f%3e%3cMIN_STOCK_QTY%3e0%3c%2fMIN_STOCK_QTY%3e%3cACTIVE%3eTrue%3c%2fACTIVE%3e%3cEAN%3e501302462%3c%2fEAN%3e%3cOPENSUPPLORDERS%3e0%3c%2fOPENSUPPLORDERS%3e%3c%2fARTICLE_ITEM%3e HTTP/1.1" 200 349 "-" "-"
</span><br>
</div>
</body>
</html>
edite depois de mais explicações sobre o problema.
Mais explicações.
xsltproc realiza a transformação do documento de entrada com base no modelo (remdivs.xslt), eu uso a opção --html para relaxar a validação xml rígida, pois o documento de entrada contém <br>
empty elements (em oposição a <br/>
).
O processador primeiro pega seu documento de entrada e constrói um modelo de documento na memória, depois percorre os elementos no modelo aplicando os modelos encontrados no .xslt
Olhando para o .xslt
, ele contém a declaração de preâmbulo e, em seguida, algumas regras gerais de processamento que ajudam a definir o tipo de saída necessária.
Existem apenas dois modelos, o primeiro
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
Este modelo tem um atributo match
, portanto, ele é aplicado somente aos elementos no documento de entrada que correspondem à expressão de correspondência. Nesse caso, a expressão é "@* | node()"
, que corresponderá a qualquer atributo ou a qualquer nó em seu documento, a coisa toda! O que ele faz para esses elementos é apresentado por dentro, ele copia a saída da aplicação de cada modelo seletivamente, mas os modelos de critérios de seleção serão o nome de cada atributo e elemento. O efeito é que, se apenas este modelo estivesse presente, seria uma cópia do seu documento de entrada original, com as regras de processamento de saída aplicadas.
O segundo modelo faz a rejeição.
<xsl:template match="div[@class='block highlight']"/>
Aqui, ele corresponde especificamente a <div>
elements que possuem um atributo chamado class
, com um valor de 'block highlight'
. então, aqueles <div>...</div>
blocos onde isto corresponde, são substituídos pela saída que este modelo produz, seno este está vazio (tem uma finalização /
), nenhuma saída é produzida.
Isso, por outro lado,
<xsl:template match="div[@class='block highlight']">
suppressed div output<br>
</xsl:template>
Produzirá algum texto no lugar do bloco div suprimido.
Veja um modelo de supressão diferente com base na sua pergunta revisada.
<xsl:template match="div">
<xsl:choose>
<xsl:when test="not(contains(span[@class='line'],'GET /thestring'))">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise><!-- Just do nothing to supress output -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Este modelo é aplicado a todos os elementos div. Ele testa se o conteúdo de texto de qualquer um de seus elementos de span filho, que também contém o valor do atributo class
de line
, não contém a string 'GET / thestring' '.
Quando não contém a string, fazemos o mesmo tipo de cópia que no primeiro modelo, caso contrário, não fazemos nada para suprimir a saída desse bloco div.
Leia mais sobre o XPath, que define como endereçar os elementos e atributos de um documento e o XSLT para escrever modelos de processamento; esses exemplos devem ajudar a torná-lo mais claro para o iniciante.