exeleon
exeleon

Reputation: 121

XSL transform to include css

I'm attempting to duplicate an xml via XSLT and the CSS from the source XML is being placed in the body of the xhtml xml file and the head element appears to be empty. How do I get the CSS reference in the correct place so that it formats the newly created XML file.

Source XML

<?xml version="1.0" encoding="utf-8"?>

<?DOCTYPE album SYSTEM "music_inventory.dtd"?>
<?xml-stylesheet type="text/css" href="music_inventory.css"?>
<music_inventory>
 <album id="LEDZEP" type="full_length" albumart="http://upload.wikimedia.org/wikipedia/en/c/cb/Led_Zeppelin_-_Mothership.jpg">
  <artist>Led Zepplin</artist>
  <name>Mothership</name>
  <year>1968</year>
  <label>Atlantic</label>
  <disc>1</disc>
  <totaldiscs>1</totaldiscs>
  <tracklist>
   <track id="1">Good Times Bad Times</track>
   <track id="2">Communication Breakdown</track>
   <track id="3">Dazed and Confused</track>
   <track id="4">Babe I'm gonna Leave You</track>
   <track id="5">Whole Lotta Love</track>
   <track id="6">Ramble On</track>
   <track id="7">Heartbreaker</track>
   <track id="8">Immigrant Song</track>
   <track id="9">Since I've Been Loving You</track>
   <track id="10">Rock and Roll</track>
   <track id="11">Black Dog</track>
   <track id="12">When the Levee Breaks</track>
   <track id="13">Stairway to Heaven</track>
  </tracklist>
 </album>
 <album id="SUBL" type="full_length" albumart="http://upload.wikimedia.org/wikipedia/en/thumb/9/94/Sublime_Self-Titled.jpg/220px-Sublime_Self-Titled.jpg">
  <artist>Sublime</artist>
  <name>Sublime</name>
  <year>1996</year>
  <label>MCA</label>
  <disc>1</disc>
  <totaldiscs>1</totaldiscs>
  <tracklist>
   <track id="1">Garden Grove</track>
   <track id="2">What I Got</track>
   <track id="3">Wrong Way</track>
   <track id="4">Same in the End</track>
   <track id="5">April 29, 1992 (Miami)</track>
   <track id="6">Santeria</track>
   <track id="7">Seed</track>
   <track id="8">Jailhouse</track>
   <track id="9">Pawn Shop</track>
   <track id="10">Paddle Out</track>
   <track id="11">The Ballad of Johnny Butt</track>
   <track id="12">Burritos</track>
   <track id="13">Under My Voodoo</track>
   <track id="14">Get Ready</track>
   <track id="15">Caress Me Down</track>
   <track id="16">What I Got (Reprise)</track>
   <track id="17">Doin' Time</track>
  </tracklist>
 </album>
</music_inventory>

XSL

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

       <xsl:output method="xml" />


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



      <xsl:param name="albumid">SUBL</xsl:param>
       <xsl:template match="/">
         <html> 
         <body>
          <xsl:apply-templates/>
         </body>
         </html>
       </xsl:template>
       <xsl:template match="music_inventory">
         <xsl:apply-templates select="album[@id=$albumid]"/>
       </xsl:template>

       <!--creates hyperlink-->
       <xsl:template match="album/name">
        <id>
         <a xmlns="http://www.w3.org/1999/xhtml"
          href="{../@id}.xhtml">
           <xsl:value-of select="."/>
         </a>
        </id>
       </xsl:template>

    </xsl:stylesheet>

Resulting XML (note the placement of the stylesheet reference)

    <?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml">
<body><?xml-stylesheet type="text/css" href="music_inventory.css"?><album xmlns="" id="SUBL" type="full_length" albumart="http://upload.wikimedia.org/wikipedia/en/thumb/9/94/Sublime_Self-Titled.jpg/220px-Sublime_Self-Titled.jpg">
      <artist>Sublime</artist>
      <id xmlns="http://www.w3.org/1999/xhtml"><a href="SUBL.xhtml">Sublime</a></id>
      <year>1996</year>
      <label>MCA</label>
      <disc>1</disc>
      <totaldiscs>1</totaldiscs>
      <tracklist>
       <track id="1">Garden Grove</track>
       <track id="2">What I Got</track>
       <track id="3">Wrong Way</track>
       <track id="4">Same in the End</track>
       <track id="5">April 29, 1992 (Miami)</track>
       <track id="6">Santeria</track>
       <track id="7">Seed</track>
       <track id="8">Jailhouse</track>
       <track id="9">Pawn Shop</track>
       <track id="10">Paddle Out</track>
       <track id="11">The Ballad of Johnny Butt</track>
       <track id="12">Burritos</track>
       <track id="13">Under My Voodoo</track>
       <track id="14">Get Ready</track>
       <track id="15">Caress Me Down</track>
       <track id="16">What I Got (Reprise)</track>
       <track id="17">Doin' Time</track>
      </tracklist>
     </album></body></html>

Upvotes: 0

Views: 549

Answers (2)

michael.hor257k
michael.hor257k

Reputation: 117175

the head element appears to be empty.

There is no head element in your output. If you want to have a head element you must create it - and if you don't want it to be empty, you must put something in it.

For example, you could do:

<xsl:template match="/">
    <html> 
        <head>
            <xsl:copy-of select="processing-instruction('xml-stylesheet')" />
        </head>
        <body>
            <xsl:apply-templates select="music_inventory/album[@id=$albumid]"/>
        </body>
    </html>
</xsl:template>

This would create a head section in your output document and copy the processing-instruction linking to the stylesheet into it, with no change.

Whether that's what you want is not quite clear to me. I think your stylesheet has numerous issues which are unrelated to your current question, and which I don't have time to go into now. As a result, it's hard to tell what exactly is the result you want to end up with, and whether such result would be useful for anything.

Upvotes: 0

Linga Murthy C S
Linga Murthy C S

Reputation: 5432

The template matching / has the problem. You may use this stylesheet:

<xsl:stylesheet  version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" >
    <xsl:output method="xml" />
    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:param name="albumid">SUBL</xsl:param>
    <xsl:template match="/">
        <xsl:apply-templates select="processing-instruction()"/>
        <html>
            <body>
                <xsl:apply-templates select="*"/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="music_inventory">
        <xsl:apply-templates select="album[@id=$albumid]"/>
    </xsl:template>
    <!--creates hyperlink-->
    <xsl:template match="album/name">
        <id>
            <a xmlns="http://www.w3.org/1999/xhtml" href="{../@id}.xhtml">
                <xsl:value-of select="."/>
            </a>
        </id>
    </xsl:template>
</xsl:stylesheet>

Upvotes: 2

Related Questions