Re: [xsl] html as input to xslt

Subject: Re: [xsl] html as input to xslt
From: Lou Iorio <lou@xxxxxxxxxxxx>
Date: Tue, 04 Sep 2007 19:07:12 -0400
Thanks for the help.

Here is more specifically what I'm trying to do. I have an xhtml file (created from an html file using tidy:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
<html xmlns="http://www.w3.org/1999/xhtml";>
<head>
 <title>yellow</title>
</head>
<body>
 <div class="navheader">
   <p>navheader</p>
 </div>
 <div class="something">
   <p>something</p>
 </div>
 <p>plain</p>
</body>
</html>

I want to change it so the file is copied exactly, except that the <div class="navheader"> is spit out in place,
followed by more markup. Here's what I'm trying:


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:xhtml="http://www.w3.org/1999/xhtml"; version="1.0">
 <xsl:output method="html" />
 <xsl:template match="node()|@*">
   <xsl:copy>
     <xsl:apply-templates select="@*" />
     <xsl:apply-templates />
   </xsl:copy>
 </xsl:template>
 <xsl:template match="//div[@class='header']">
   <xsl:copy-of select="." />
   <p>other stuff</p>
 </xsl:template>
</xsl:stylesheet>

And here's what I'm getting:

>xsltproc test.xsl test.html
<html xmlns="http://www.w3.org/1999/xhtml";>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>yellow</title>
</head>
<body>
 <div class="navheader">
   <p>navheader</p>
 </div>
 <div class="something">
   <p>something</p>
 </div>
 <p>plain</p>
</body>
</html>

Note that the <p>other stuff</p> is not in the output. I'm sure it's something simple, but
I don't get it.


Lou
--------------------------------------------------------------------------------
Andrew Welch wrote:
On 8/31/07, Lou Iorio <lou@xxxxxxxxxxxx> wrote:
This is probably a naive question, but I could not find it in the archives.

Can I transform xhtml documents using xsl, or does this just not make sense?

I'm trying to replace a tag with a specified attribute to another tag.

The only xpath that does anything is *, which dumps the text of the html.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
  <xsl:template match="/">
    <verse>
    <xsl:value-of select="*"/>
    </verse>
  </xsl:template>
</xsl:stylesheet>

I'm using xsltproc and saxon8, both of which do the same thing.

xhtml is in the namespace "http://www.w3.org/1999/xhtml"; so you'll need to modify your stylesheet to match elements in that namespace eg:

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns="xhtml:"http://www.w3.org/1999/xhtml";
version="1.0">

 <xsl:template match="/">
   <verse>
   <xsl:value-of select="xhtml:html/xhtml:body/xhtml:div/blah"/>
   </verse>
 </xsl:template>

</xsl:stylesheet>

Note the namespace declaration on the xsl:stylesheet element and the
modified xpath.

In XSLT 2.0 there's the xpath-default-namespace which is probably
better than bloating your  XPaths with the prefix.

Current Thread