xslt help - 我的变换无法正确渲染

时间:2010-05-28 16:47:10

标签: c# asp.net xml xslt

我正在尝试使用以下文件应用xlst转换。这是非常基本的,但是当我让它正常工作时,我想要建立起来。

 <?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>

这是我用于源的一些xml。

 <StationInventoryList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns="http://www.dummy-tmdd-address">
  <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>

任何想法我做错了什么?这里的简单目的是制作一个车站列表,然后在车站制作一个探测器列表。这是XML的一小部分。它将有多个StationInventory元素。

我使用数据作为asp:xml控件的源代码,将xslt文件作为转换源。

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

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

任何提示当然都值得赞赏。周末愉快。

干杯, 〜CK

2 个答案:

答案 0 :(得分:1)

有两个明显的问题

  1. XML文档中的所有元素都在默认命名空间中,但在XSLT代码中,它们被引用为属于“无命名空间”。

  2. 元素<StationInventory>没有任何<detector>个孩子。

  3. <强>解决方案

    在下面的XSLT样式表中,上述两个问题已得到纠正:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:d="http://www.dummy-tmdd-address">
     <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>
    

    结果现在是一个完整的输出,很可能是想要的

    <div xmlns:d="http://www.dummy-tmdd-address">
        <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>
    

答案 1 :(得分:1)

替换为

  <?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">
<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>

因为探测器是探测器列表的子站而不是站点库存并且有命名空间