2015-09-05 97 views
0

这里是我的xml:如果我改变这一行XSL属性值没有得到显示

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

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

造成这样的:

<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属性未被选中?它只会接受名称属性。尝试'身份证',但没有去。我正在使用C#XslCompiledTransform来执行转换。谢谢!

+0

源XML中没有'href'属性。唯一相似的是'ref'。 –

+0

我更新了xml以显示href现在(仍然不起作用)。我想也许href是一个保留字,所以我尝试了参考和其他属性名称。 – user3102739

+0

对不起,我不得不走出来几个小时。我已按照您的要求提供了完整的xsl。 – user3102739

回答

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保留字,所以我尝试了裁判和其他属性的名称。

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

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

将只检索被称为的“href”属性的内容。

+0

谢谢。我试着把你放在一起的小提琴,这确实有效,但是当我将它应用于我的代码时,我仍然失败。另外,上面的xml有一个名为datatype的标签。当我使用这个标签时,它就起作用了。啊,我刚刚意识到,也许它失败了,因为只有一个COL节点有href属性? – user3102739

+0

@ user3102739你的意思是“将它应用到你的代码中”是什么意思?如果样式表中有其他模板,请编辑您的问题以显示与问题相关的代码。不,如果只有一个'COL'元素在输入中具有'href'属性,那么只有_one_'href'应该在结果中是空的,而不是另一个。这适用于您的初始版本和我的版本的代码。 –

+0

正如你可以从我的xsl看到的,我没有对它进行转换,但是用C#做了这样的转换,其中你的示例使用了转换语句。 – user3102739