[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Random Namespaces Declared with XSLT Stylesheet... why

Subject: Random Namespaces Declared with XSLT Stylesheet... why?
From: "Jimmy Cerra" <jimbolist@xxxxxxxxxxx>
Date: Thu, 19 Jun 2003 04:06:09 -0400
xslt substring after last
I've been hacking a quick-and-dirty transform for turning a custom
language [1] into HTML (for presentation), but I've got some odd
behavior.  The stylesheet seems to randomly put namespace declarations
where they're not needed.  Why is it doing this?

Note:
  * I'm using Xalan-J for transforms.
  * The stylesheet can be found at [2].
  * The input document can be found at [3].
  * The output document can be found at [4].

Oddly, the stylesheet works in Internet Explorer 6 (with msxml.net
installed) but not in Mozilla (version 1.4b tested).  The Stylesheet is
also transcribed (with tabs converted into double-spaces for the
fixed-length nature of the email) at the end of this email, but I still
have the links posted [5].

--
Jimmy Cerra

] "If the path is set in stone,
]  use a sledgehammer." - Me

[1] It's an experimental XML syntax for RDF.

[2]
http://www.pitt.edu/~jfcst24/2003/06/17/rdf/basic/x/XMLSchema-descriptio
nx-stylesheet.xsl

[3]
http://www.pitt.edu/~jfcst24/2003/06/17/rdf/basic/x/XMLSchema-descriptio
n1.xml

[4] http://www.pitt.edu/~jfcst24/2003/06/17/rdf/basic/x/test.html

[5] Garenteed online until 7/18/2003 or my bandwith runs out. ;-)

Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns     = "http://www.w3.org/1999/xhtml"
  xmlns:dc  = "http://purl.org/dc/elements/1.1/"
  xmlns:rdf = "http://www.purl.org/jfc/2003/06/17/rdf/basic/x#"
  xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">


  <!-- match templates -->
  <xsl:template match="/">
    <html>
      <head>
        <title>RDF Graph</title>
      </head>
      <body>
        <xsl:apply-templates select="rdf:graph" />
      </body>
    </html>
  </xsl:template>


  <xsl:template match="rdf:graph">
    <xsl:apply-templates select="./rdf:subject" />
  </xsl:template>


  <xsl:template match="rdf:subject">
    <h1 style="font-size: 125%">Description of <xsl:choose>
        <xsl:when test="contains(@rdf:name,'|')">
          <xsl:element name="a">
            <xsl:attribute name="href">
              <xsl:call-template name="rname2uri">
                <xsl:with-param name="rname" select="@rdf:name" />
                <xsl:with-param name="context" select="." />
              </xsl:call-template>
            </xsl:attribute>
            <xsl:value-of select="substring-after(@rdf:name,'|')" />
          </xsl:element>
        </xsl:when>
        <xsl:otherwise>
          <xsl:element name="a">
            <xsl:attribute name="href">
              <xsl:value-of select="@rdf:name" />
            </xsl:attribute>
            <xsl:call-template name="substring-after-last-mod">
              <xsl:with-param name="input"  select="@rdf:name" />
              <xsl:with-param name="substr" select="'/'" />
            </xsl:call-template>
          </xsl:element>
        </xsl:otherwise>
    </xsl:choose></h1>
    <table border="1" style="margin:0em 1em 2em 1em">
      <tr>
        <th align="right" style="padding-right:.75em"
width="25%">Property</th>
        <th align="left" style="padding-left:.75em">Value</th>
      </tr>
      <xsl:apply-templates select="./rdf:predicate" />
    </table>
  </xsl:template>


  <xsl:template match="rdf:predicate">
    <tr>
      <td align="right" style="padding-right:.75em">
        <xsl:choose>
          <xsl:when test="contains(@rdf:name,'|')">
            <xsl:element name="a">
              <xsl:attribute name="href">
                <xsl:call-template name="rname2uri">
                  <xsl:with-param name="rname" select="@rdf:name" />
                  <xsl:with-param name="context" select="." />
                </xsl:call-template>
              </xsl:attribute>
              <xsl:value-of select="substring-after(@rdf:name,'|')" />
            </xsl:element>
          </xsl:when>
          <xsl:otherwise>
            <xsl:element name="a">
              <xsl:attribute name="href">
                <xsl:value-of select="@rdf:name" />
              </xsl:attribute>
              <xsl:call-template name="substring-after-last-mod">
                <xsl:with-param name="input"  select="@rdf:name" />
                <xsl:with-param name="substr" select="'/'" />
              </xsl:call-template>
            </xsl:element>
          </xsl:otherwise>
        </xsl:choose>
      </td>
      <td style="padding-left:.75em">
        <xsl:choose>
          <xsl:when test="@rdf:object">
            <xsl:choose>
              <xsl:when test="contains(@rdf:object,'|')">
                <xsl:element name="a">
                  <xsl:attribute name="href">
                    <xsl:call-template name="rname2uri">
                      <xsl:with-param name="rname" select="@rdf:object"
/>
                      <xsl:with-param name="context" select="." />
                    </xsl:call-template>
                  </xsl:attribute>
                  <xsl:value-of
select="substring-after(@rdf:object,'|')" />
                </xsl:element>
              </xsl:when>
              <xsl:otherwise>
                <xsl:element name="a">
                  <xsl:attribute name="href">
                    <xsl:value-of select="@rdf:object" />
                  </xsl:attribute>
                  <xsl:call-template name="substring-after-last-mod">
                    <xsl:with-param name="input"  select="@rdf:object"
/>
                    <xsl:with-param name="substr" select="'/'" />
                  </xsl:call-template>
                </xsl:element>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:when>
          <xsl:otherwise>
            <xsl:apply-templates select="node()" />
          </xsl:otherwise>
        </xsl:choose>
      </td>
    </tr>
  </xsl:template>


  <!-- named templates -->
  <xsl:template name="rname2uri">
    <xsl:param name="rname" />
    <xsl:param name="context" />
    <xsl:choose>
      <xsl:when test="contains($rname,'|')">
        <xsl:value-of select="concat(
          namespace::*[name(.)=substring-before($rname,'|')],
          substring-after($rname,'|'))"
        />
      </xsl:when>
      <xsl:otherwise>
        <xsl:message terminate="no">Warning, <xsl:value-of
select="$rname" /> does not contain '|'</xsl:message>
        <xsl:value-of select="$rname" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>


  <xsl:template name="htmlNamespaceTable">
    <table border="1">
      <xsl:for-each select="namespace::*">
        <tr><td><xsl:value-of select="name(.)" /></td><td><xsl:value-of
select="." /></td></tr>
      </xsl:for-each>
    </table>
  </xsl:template>


  <!-- copy template from "XSLT Cookbook" by Sal Mangano -->
  <!--   HIGHLY                                           -->
  <!-- I        recommend the book                         -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
  </xsl:template>


  <!-- substring after last occurance also from "XSLT Cookbook"...-->
  <!-- I should buy Sal Mangano a drink!                          -->
  <xsl:template name="substring-after-last">
    <xsl:param name="input" />
    <xsl:param name="substr" />
    
    <!-- Extract the string which comes after the first occurence -->
    <xsl:variable name="temp" select="substring-after($input,$substr)"
/>
    
    <xsl:choose>
      <!-- If it still contains the search string then recursively
process 
-->
      <xsl:when test="$substr and contains($temp,$substr)">
        <xsl:call-template name="substring-after-last">
          <xsl:with-param name="input"  select="$temp" />
          <xsl:with-param name="substr" select="$substr" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$temp" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>


  <!-- my modifications of above template                      -->
  <!-- outputs $input instead of null if $substr not in $input -->
  <xsl:template name="substring-after-last-mod">
    <xsl:param name="input" />
    <xsl:param name="substr" />
    
    <xsl:choose>
      <xsl:when test="contains($input,$substr)">
        <xsl:call-template name="substring-after-last">
          <xsl:with-param name="input"  select="$input" />
          <xsl:with-param name="substr" select="$substr" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$input" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.