diff --git a/Util/BlazeFromHtml.hs b/Util/BlazeFromHtml.hs
--- a/Util/BlazeFromHtml.hs
+++ b/Util/BlazeFromHtml.hs
@@ -4,7 +4,8 @@
 
 import Control.Monad (forM_, when)
 import Control.Applicative ((<$>))
-import Data.Maybe (listToMaybe, fromMaybe)
+import Data.List (isPrefixOf, stripPrefix)
+import Data.Maybe (listToMaybe, fromMaybe, fromJust)
 import Data.Char (toLower, isSpace)
 import Control.Arrow (first)
 import System.Environment (getArgs)
@@ -159,11 +160,17 @@
                                        ++ show variant
   where
     combinator = qualifiedSanitize "H." tag ++ attributes'
-    attributes' = attrs >>= \(k, v) -> if k `elem` attributes variant
-        then " ! " ++ qualifiedSanitize "A." k ++ " " ++ show v
-        else if ignore
-            then ""
-            else error $ "Attribute " ++ k ++ " is illegal in " ++ show variant
+    attributes' = attrs >>= \(k, v) -> case k `elem` attributes variant of
+        True  -> " ! " ++ qualifiedSanitize "A." k ++ " " ++ show v
+        False
+            | "data-" `isPrefixOf` k -> " ! "
+                                     ++ "dataAttribute" ++ " "
+                                     ++ show (fromJust $ stripPrefix "data-" k)
+                                     ++ " " ++ show v
+            | ignore                 -> ""
+            | otherwise              -> error $ "Attribute "
+                                     ++ k ++ " is illegal in "
+                                     ++ show variant
 
     -- Qualifies a tag with the given qualifier if needed, and sanitizes it.
     qualifiedSanitize qualifier tag' =
diff --git a/Util/GenerateHtmlCombinators.hs b/Util/GenerateHtmlCombinators.hs
--- a/Util/GenerateHtmlCombinators.hs
+++ b/Util/GenerateHtmlCombinators.hs
@@ -21,12 +21,12 @@
 -- | Datatype for an HTML variant.
 --
 data HtmlVariant = HtmlVariant
-    { version    :: [String]
-    , docType    :: [String]
-    , parents    :: [String]
-    , leafs      :: [String]
-    , attributes :: [String]
-    , openLeafs  :: Bool
+    { version     :: [String]
+    , docType     :: [String]
+    , parents     :: [String]
+    , leafs       :: [String]
+    , attributes  :: [String]
+    , selfClosing :: Bool
     } deriving (Eq)
 
 instance Show HtmlVariant where
@@ -60,7 +60,7 @@
     createDirectoryIfMissing True basePath
 
     let tags =  zip parents' (repeat makeParent)
-             ++ zip leafs' (repeat $ makeLeaf $ openLeafs htmlVariant)
+             ++ zip leafs' (repeat (makeLeaf $ selfClosing htmlVariant))
         sortedTags = sortBy (comparing fst) tags
         appliedTags = map (\(x, f) -> f x) sortedTags
 
@@ -218,10 +218,10 @@
 
 -- | Generate a function for an HTML tag that must be a leaf.
 --
-makeLeaf :: Bool    -- ^ If we should use open leafs
+makeLeaf :: Bool    -- ^ Make leaf tags self-closing
          -> String  -- ^ Tag for the combinator
          -> String  -- ^ Combinator code
-makeLeaf openLeaf tag = unlines
+makeLeaf closing tag = unlines
     [ DO_NOT_EDIT
     , "-- | Combinator for the @\\<" ++ tag ++ " />@ element."
     , "--"
@@ -234,12 +234,12 @@
     , "-- > <" ++ tag ++ " />"
     , "--"
     , function ++ " :: Html  -- ^ Resulting HTML."
-    , function ++ " = Leaf \"" ++ tag ++ "\" \"<" ++ tag ++ "\" " ++ end
+    , function ++ " = Leaf \"" ++ tag ++ "\" \"<" ++ tag ++ "\" " ++ "\""
+               ++ (if closing then " /" else "") ++ ">\""
     , "{-# INLINE " ++ function ++ " #-}"
     ]
   where
     function = sanitize tag
-    end = if openLeaf then "\">\"" else "\" />\""
 
 -- | Generate a function for an HTML attribute.
 --
@@ -305,7 +305,7 @@
         , "tabindex", "title", "type", "usemap", "valign", "value", "valuetype"
         , "width"
         ]
-    , openLeafs = True
+    , selfClosing = False
     }
 
 -- | HTML 4.0 Transitional
@@ -326,16 +326,16 @@
         [ "background", "bgcolor", "clear", "compact", "hspace", "language"
         , "noshade", "nowrap", "start", "target", "vspace"
         ]
-    , openLeafs = True
+    , selfClosing = False
     }
 
--- | HTML 4.0 Frameset
+-- | HTML 4.0 FrameSet
 --
 html4FrameSet :: HtmlVariant
 html4FrameSet = HtmlVariant
     { version = ["Html4", "FrameSet"]
     , docType =
-        [ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\""
+        [ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 FrameSet//EN\""
         , "    \"http://www.w3.org/TR/html4/frameset.dtd\">"
         ]
     , parents = parents html4Transitional ++ ["frameset"]
@@ -343,9 +343,54 @@
     , attributes = attributes html4Transitional ++
         [ "frameborder", "scrolling"
         ]
-    , openLeafs = True
+    , selfClosing = False
     }
 
+-- | XHTML 1.0 Strict
+--
+xhtml1Strict :: HtmlVariant
+xhtml1Strict = HtmlVariant
+    { version = ["XHtml1", "Strict"]
+    , docType =
+        [ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\""
+        , "    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
+        ]
+    , parents = parents html4Strict
+    , leafs = leafs html4Strict
+    , attributes = attributes html4Strict
+    , selfClosing = True
+    }
+
+-- | XHTML 1.0 Transitional
+--
+xhtml1Transitional :: HtmlVariant
+xhtml1Transitional = HtmlVariant
+    { version = ["XHtml1", "Transitional"]
+    , docType =
+        [ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
+        , "    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
+        ]
+    , parents = parents html4Transitional
+    , leafs = leafs html4Transitional
+    , attributes = attributes html4Transitional
+    , selfClosing = True
+    }
+
+-- | XHTML 1.0 FrameSet
+--
+xhtml1FrameSet :: HtmlVariant
+xhtml1FrameSet = HtmlVariant
+    { version = ["XHtml1", "FrameSet"]
+    , docType =
+        [ "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 FrameSet//EN\""
+        , "    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">"
+        ]
+    , parents = parents html4FrameSet
+    , leafs = leafs html4FrameSet
+    , attributes = attributes html4FrameSet
+    , selfClosing = True
+    }
+
 -- | HTML 5.0
 -- A good reference can be found here:
 -- http://www.w3schools.com/html5/html5_reference.asp
@@ -383,7 +428,7 @@
         , "hreflang", "http-equiv", "icon", "id", "ismap", "item", "itemprop"
         , "keytype", "label", "lang", "list", "loop", "low", "manifest", "max"
         , "maxlength", "media", "method", "min", "multiple", "name"
-        , "novalidate", "onbeforeonload", "onbeforeprint", "oncanplay"
+        , "novalidate", "onbeforeonload", "onbeforeprint", "onblur", "oncanplay"
         , "oncanplaythrough", "onchange", "oncontextmenu", "onclick"
         , "ondblclick", "ondrag", "ondragend", "ondragenter", "ondragleave"
         , "ondragover", "ondragstart", "ondrop", "ondurationchange", "onemptied"
@@ -404,7 +449,7 @@
         , "summary", "tabindex", "target", "title", "type", "usemap", "value"
         , "width", "wrap", "xmlns"
         ]
-    , openLeafs = False
+    , selfClosing = False
     }
 
 -- | A map of HTML variants, per version, lowercase.
@@ -414,6 +459,9 @@
     [ html4Strict
     , html4Transitional
     , html4FrameSet
+    , xhtml1Strict
+    , xhtml1Transitional
+    , xhtml1FrameSet
     , html5
     ]
 
diff --git a/blaze-from-html.cabal b/blaze-from-html.cabal
--- a/blaze-from-html.cabal
+++ b/blaze-from-html.cabal
@@ -1,26 +1,34 @@
-Name:                blaze-from-html
-Version:             0.3.1.0
-Synopsis:            Tool to convert HTML to BlazeHtml code.
-Description:         Tool that converts HTML files to Haskell code, ready to be
-                     used with the BlazeHtml library.
-Homepage:            http://jaspervdj.be/blaze
-Bug-Reports:         http://github.com/jaspervdj/BlazeHtml/issues
-License:             BSD3
-License-file:        LICENSE
-Author:              Jasper Van der Jeugt, Simon Meier
-Maintainer:          jaspervdj@gmail.com, simon.meier@inf.ethz.ch
-Stability:           Experimental
-Category:            Text
-Build-type:          Simple
-Cabal-version:       >= 1.2
+Name:          blaze-from-html
+Version:       0.3.2.0
+Synopsis:      Tool to convert HTML to BlazeHtml code.
+Description:   Tool that converts HTML files to Haskell code, ready to be
+               used with the BlazeHtml library.
+Homepage:      http://jaspervdj.be/blaze
+Bug-Reports:   http://github.com/jaspervdj/BlazeHtml/issues
+License:       BSD3
+License-file:  LICENSE
+Author:        Jasper Van der Jeugt, Simon Meier
+Maintainer:    jaspervdj@gmail.com, simon.meier@inf.ethz.ch
+Stability:     Experimental
+Category:      Text
+Build-type:    Simple
+Cabal-version: >= 1.6
 
 Executable blaze-from-html
-  Ghc-Options:       -Wall
-  Main-Is:           Util/BlazeFromHtml.hs
-  Other-Modules:     Util.GenerateHtmlCombinators,
-                     Util.Sanitize
-  Build-depends:     base >= 4 && < 5,
-                     containers >= 0.3,
-                     filepath >= 1.1,
-                     directory >= 1.0,
-                     tagsoup >= 0.10
+  Ghc-Options: -Wall
+  Main-Is:     Util/BlazeFromHtml.hs
+
+  Other-Modules:
+    Util.GenerateHtmlCombinators
+    Util.Sanitize
+
+  Build-depends:
+    base       >= 4    && < 5,
+    containers >= 0.3,
+    directory  >= 1.0,
+    filepath   >= 1.1,
+    tagsoup    >= 0.10
+
+Source-repository head
+  Type:     git
+  Location: http://github.com/jaspervdj/blaze-html.git
