SOFTELメモ

Softel Inc.

HTMLから特定のタグや属性を除去する XSLT

問題

HTMLから特定のタグ、特定の属性、特定のタグと属性の組み合わせなどを除去したい。

(ある場面で許可されていない属性やタグを除去したい)

cleaning

答え

例えば XSLT(XSL変換)で。


以下のような 1.html があるとする(1行目のmetaタグは日本語を使う兼ね合いで文字コード判定のため付与してやってください)。

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<div class="hoge" id="hogehoge">
	<p class="fuga" style="text-align:center;">
		これは、
		<span style="font-size:100px;">テスト</span>
		です。
	</p>
</div>

以下のような 1.xsl があるとする。

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

  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@style">
  </xsl:template>

  <xsl:template match="@*">
    <xsl:copy></xsl:copy>
  </xsl:template>

</xsl:stylesheet>

以下のように変換すると

<?php
$htmlstr = file_get_contents('1.html');
$xslstr = file_get_contents('1.xsl');
$xml = new DOMDocument;
$xml->loadHTML($htmlstr);
$xsl = new DOMDocument;
$xsl->loadXML($xslstr);
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
echo $proc->transformToXML($xml);

結果はこうなる(style属性を除去できた)

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
<body><div class="hoge" id="hogehoge">
	<p class="fuga">
		これは、
		<span>テスト</span>
		です。
	</p>
</div></body>
</html>

他の例。

特定のタグを、タグの中身も一緒に除去する(spanタグを除去)

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

  <xsl:template match="span">
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
<body><div class="hoge" id="hogehoge">
	<p class="fuga" style="text-align:center;">
		これは、
		
		です。
	</p>
</div></body>
</html>

特定のタグを、タグの中身はそのままで、タグだけ除去する(pタグだけ除去)。

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

  <xsl:template match="p">
      <xsl:apply-templates select="node()"/>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
<body><div class="hoge" id="hogehoge">
	
		これは、
		<span style="font-size:100px;">テスト</span>
		です。
	
</div></body>
</html>

あるタグにある属性以外が使われていたら、属性を除去する(span要素のstyle属性だけ削除)

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

	<xsl:template match="/">
		<xsl:apply-templates select="/html/body/div" />
	</xsl:template>

	<xsl:template match="*">
		<xsl:copy>
			<xsl:apply-templates select="@*|node()"/>
		</xsl:copy>
	</xsl:template>

	<xsl:template match="@*">
		<xsl:copy></xsl:copy>
	</xsl:template>

	<xsl:template match="span/@style">
	</xsl:template>

</xsl:stylesheet>

<?xml version="1.0"?>
<div class="hoge" id="hogehoge">
	<p class="fuga" style="text-align:center;">
		これは、
		<span>テスト</span>
		です。
	</p>
</div>

関連するメモ

コメント