tags:

views:

27

answers:

2

Hi All, I'm trying to apply an xlst transformation using the following file. This is very basic, but I wanted to build off of this when I get it working correctly.

 <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:template match="/">
  <div>
  <h2>Station Inventory</h2>
  <hr/>
  <xsl:apply-templates/>
  </div>
</xsl:template>

 <xsl:template match="StationInventory">
   <h5><xsl:value-of select="station-name" /></h5>
   <xsl:apply-templates select="detector"/>
  </xsl:template>


  <xsl:template match="detector">
   <span>
     <xsl:value-of select="detector-name" />
  </span>
  <br/>
  </xsl:template>
 </xsl:stylesheet>

Here is some xml I'm using for the source.

 <StationInventoryList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns="http://www.dummy-tmdd-address"&gt;
  <StationInventory>
   <station-id>9940</station-id>
   <station-name>Zone 9940-SEB</station-name>
   <station-travel-direction>SEB</station-travel-direction>
   <detector-list>
  <detector>
    <detector-id>2910</detector-id>
    <detector-name>1999 West Smith Exit SEB</detector-name>
  </detector>
  <detector>
    <detector-id>9205</detector-id>
    <detector-name>CR-155 Exit SEB</detector-name>
  </detector>
  <detector>
    <detector-id>9710</detector-id>
    <detector-name>Pt of View SEB</detector-name>
  </detector>
  </detector-list>
  </StationInventory>
</StationInventoryList>

Any ideas what I'm doing wrong? The simple intent here is to make a list of station, then make a list of detectors at a station. This is a small piece of the XML. It would have multiple StationInventory elements.

I'm using the data as the source for an asp:xml control and the xslt file as the transformsource.

        var service = new InternalService();
        var result = service.StationInventory();

        invXml.DocumentContent = result;
        invXml.TransformSource = "StationInventory.xslt";
        invXml.DataBind();

Any tips are of course appreciated. Have a terrific weekend.

Cheers, ~ck

+1  A: 

There are two obvious problems:

  1. All elements in the XML document are in the default namespace, but in the XSLT code they are referenced as belonging to "no namespace".

  2. The element <StationInventory> doesn't have any <detector> children.

Solution:

In the XSLT stylesheet below the above two problems are corrected:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:d="http://www.dummy-tmdd-address"&gt;
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <div>
  <h2>Station Inventory</h2>
  <hr/>
  <xsl:apply-templates/>
  </div>
 </xsl:template>

 <xsl:template match="d:StationInventory">
   <h5><xsl:value-of select="d:station-name" /></h5>
   <xsl:apply-templates select="d:detector-list/d:detector"/>
 </xsl:template>

  <xsl:template match="d:detector">
   <span>
     <xsl:value-of select="d:detector-name" />
   </span>
   <br/>
  </xsl:template>
 </xsl:stylesheet>

The result now is a complete output, that most probably was wanted:

<div xmlns:d="http://www.dummy-tmdd-address"&gt;
    <h2>Station Inventory</h2>
    <hr />
    <h5>Zone 9940-SEB</h5>
    <span>1999 West Smith Exit SEB</span>
    <br />
    <span>CR-155 Exit SEB</span>
    <br />
    <span>Pt of View SEB</span>
    <br />
</div>
Dimitre Novatchev
beautiful. Thanks so much for explaining the problem. Your answer is correct also.
Hcabnettek
+1  A: 

Replace by

  <?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" xmlns:st="http://www.dummy-tmdd-address"&gt;
<xsl:template match="/">
  <div>
  <h2>Station Inventory</h2>
  <hr/>
  <xsl:apply-templates/>
  </div>
</xsl:template>

 <xsl:template match="st:StationInventory">
   <h5><xsl:value-of select="st:station-name" /></h5>
    <ul>
        <xsl:apply-templates select="st:detector-list/st:detector"/>
    </ul>
  </xsl:template>


  <xsl:template match="st:detector">
   <li>
     <xsl:value-of select="st:detector-name" />
  </li>
  </xsl:template>
 </xsl:stylesheet>

because detector is child of detector-list not station inventory and there is a namespace

Gregoire
Beautiful. Thank you so much!
Hcabnettek