XSL属性值未显示

时间:2015-09-05 20:38:49

标签: c# xml xslt xslt-1.0

这是我的xml:

<RESPONSE heading="Broker List">
     <RESULTSET nbr="1" rowcount="11">
         <ROW nbr="1">
             <COL nbr="1" name="broker_name" datatype="String" href="api">BARC</COL>
             <COL nbr="2" name="broker_id" datatype="String">11</COL>
         </ROW>
     </RESULTSET>
</RESPONSE>

这个xls有效:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/RESPONSE">
<html>
<head>
</head>
<body class='data'>
  <h2><xsl:value-of select="./@heading"/></h2>
    <xsl:apply-templates select="RESULTSET" />
</body>
</html>
</xsl:template> 

<xsl:template match="RESULTSET">
     <table id="result" class="sortable-theme-finder" data-sortable="">
        <thead>
         <xsl:for-each select="ROW[1]/COL">
             <th> <xsl:value-of select="@name" /></th>
         </xsl:for-each>
        </thead>  
        <tbody>
          <xsl:apply-templates select="ROW" />
        </tbody>  
    </table>
    <br/>
</xsl:template>

<xsl:template match="ROW" >
      <tr>
        <xsl:apply-templates select="COL" />
     </tr>  
   </xsl:template>

   <xsl:template match="COL">
       <td border="1">
           <a><xsl:attribute name="href"><xsl:value-of select="@href"/></xsl:attribute>
            <xsl:value-of select="."/>
          </a>  
       </td>
   </xsl:template>  
</xsl:stylesheet>

导致:

<tr>
    <td border="1"><a href="broker_name">BARC</a></td>
    <td border="1"><a href="broker_id">11 </a></td>
 </tr>

但是,如果我改变这一行:

<xsl:value-of select="@name" />

<xsl:value-of select="@href" />

结果如下:

<tr>
    <td border="1"><a href="">BARC</a></td>
    <td border="1"><a href="">11 </a></td>
 </tr>

为什么没有选择@href属性?它只接受name属性。试过&#39; id&#39;也没有去。我正在使用C#XslCompiledTransform来执行转换。谢谢!

1 个答案:

答案 0 :(得分:0)

更改

<xsl:attribute name="href"><xsl:value-of select="@name"/></xsl:attribute>

<xsl:attribute name="href"><xsl:value-of select="@name"/></xsl:attribute>

在此上下文中工作(xsl:for-each内的当前上下文节点)。我稍微调整了您的样式表,但它的工作方式类似:

XSLT样式表

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:template match="ROW" >
      <tr>
        <xsl:apply-templates/>
     </tr>  
   </xsl:template>

   <xsl:template match="COL">
       <td border="1">
           <a>
               <xsl:copy-of select="@href"/>
               <xsl:apply-templates/>
           </a>
       </td>
   </xsl:template>
</xsl:transform>

XML输出

输出将完全按照您显示的输入文档:

<?xml version="1.0" encoding="UTF-8"?>
<tr>
   <td border="1">
      <a href="api">BARC</a>
   </td>
   <td border="1">
      <a>11</a>
   </td>
</tr>

正如您所看到的,保留了href属性 - 用于输入中出现的单个COL元素。

尝试此解决方案online here

  

我想也许href是一个保留字,所以我尝试了ref和其他属性名称。

不,“href”不是XML中的保留名称,也没有预定义的语义,就像在HTML中一样。

<xsl:value-of select="@href"/>

只会从名为“href”的属性中检索内容。