无法在XSLT中获取表格

时间:2010-12-13 15:22:33

标签: xslt umbraco

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
<xsl:stylesheet 
 version="1.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:msxml="urn:schemas-microsoft-com:xslt"
 xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" 
 exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets ">

<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>

<xsl:variable name="source" select="umbraco.library:GetXmlNodeById(1127)"/>
<xsl:variable name="afdelinger" select="umbraco.library:GetXmlNodeById(1128)"/>


<xsl:template match="/">
<table class="medarbejdere">

<xsl:for-each select="$afdelinger/node">
<h3><xsl:value-of select="@nodeName"/></h3>
<xsl:call-template name="medarbejdere">
<xsl:with-param name="nodeId" select="@id"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>

<xsl:template name="medarbejdere">

<xsl:param name="nodeId"/>


<xsl:for-each select="$source/node [@nodeTypeAlias='employee'] [string(data[@alias='umbracoNaviHide']) != '1']">

<xsl:variable name="preNodes">
<xsl:variable name="relatedContent" select="data[@alias='afd']" />

<xsl:variable name="nodeIds" select="umbraco.library:Split($relatedContent, ',')" />
<xsl:for-each select="$nodeIds/value">
<xsl:if test=". = $nodeId">
<xsl:value-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:variable>

<xsl:if test="$preNodes != ''">
<tr><td>
<span>
<img>
<xsl:attribute name="src">/umbraco/imageGen.ashx?image=/<xsl:value-of select="data[@alias='imageWeb']"/>&amp;width=182&amp;height=122</xsl:attribute>
<xsl:attribute name="alt"><xsl:value-of select="@nodeName"/>  -  <xsl:value-of select="data[@alias='position']"/>  -  <xsl:value-of select="data[@alias='phone']"/>  -  <xsl:value-of select="data[@alias='email']"/></xsl:attribute>
</img>
<div class="info" style="padding-bottom:0px;">
<span><strong><xsl:value-of select="@nodeName"/></strong>
<em style="left:160px;top:5px;"><xsl:value-of select="data[@alias='position']"/></em>
<span class="kontaktinfo" style="left:160px;top:5px;">
<strong style="left:160px;top:5px;"><xsl:value-of select="data[@alias='phone']"/></strong>
<strong style="left:160px;top:5px;"><a href="mailto:{data[@alias='email']}"><xsl:value-of select="data[@alias='email']"/></a></strong>
</span>
</span>
</div>
</span></td>

</tr>

</xsl:if>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

我正在尝试显示这个员工表 - 但它不会将xslt保存在Umbraco中? 给出了这个错误: System.Xml.XmlException:第18行的'table'开始标记与'xsl:template'的结束标记不匹配。第26行,第3位。

这是我想要制作的HTML:

        <h3>Kundeservice</h3>
    <table class="medarbejdere">
    <tr>
      <td><span><img src="billeder/medarbejdere/jorgen.jpg" width="180" height="122" alt="Lars Meineche - Ansvarlig for Kundeservice - +45 57 66 00 05 - <a href=mailto:th@bevola.dk>th@bevola.dk</a>" />
        <div class="info"><span><strong>Lars Meineche</strong><em>Ansvarlig for Kundeservice</em> <span class="kontaktinfo"><strong>+45 57 66 00 05</strong><strong><a href=mailto:th@bevola.dk>th@bevola.dk</a></strong></span></span></div>
     </span></td>
      <td><span><img src="billeder/medarbejdere/jorgen.jpg" width="180" height="122" alt="Lars Meineche - Ansvarlig for Kundeservice - +45 57 66 00 05 - <a href=mailto:th@bevola.dk>th@bevola.dk</a>" />
        <div class="info"><span><strong>Lars Meineche</strong><em>Ansvarlig for Kundeservice</em> <span class="kontaktinfo"><strong>+45 57 66 00 05</strong><strong><a href=mailto:th@bevola.dk>th@bevola.dk</a></strong></span></span></div>
     </span></td>
      <td><span><img src="billeder/medarbejdere/jorgen.jpg" width="180" height="122" alt="Lars Meineche - Ansvarlig for Kundeservice - +45 57 66 00 05 - <a href=mailto:th@bevola.dk>th@bevola.dk</a>" />
        <div class="info"><span><strong>Lars Meineche</strong><em>Ansvarlig for Kundeservice</em> <span class="kontaktinfo"><strong>+45 57 66 00 05</strong><strong><a href=mailto:th@bevola.dk>th@bevola.dk</a></strong></span></span></div>
     </span></td>
     </tr>
     <tr>
      <td><span><img src="billeder/medarbejdere/jorgen.jpg" width="180" height="122" alt="Lars Meineche - Ansvarlig for Kundeservice - +45 57 66 00 05 - <a href=mailto:th@bevola.dk>th@bevola.dk</a>" />
        <div class="info"><span><strong>Lars Meineche</strong><em>Ansvarlig for Kundeservice</em> <span class="kontaktinfo"><strong>+45 57 66 00 05</strong><strong><a href=mailto:th@bevola.dk>th@bevola.dk</a></strong></span></span></div>
     </span></td>
      <td></td>
      <td></td>
     </tr>
    </table>

2 个答案:

答案 0 :(得分:3)

错误非常明确:您有一个模板,其中有一个<table>开始标记,但没有结束标记。

在另一个模板中,您有</table>结束标记。但是XSLT不会独立输出开始和结束标记。它输出一个节点树,由table个元素等节点组成。然后,该节点树被序列化为格式良好的XML。

尝试独立输出开始和结束标记通常意味着您正在尝试解决分组问题。 XSLT 可以完成此任务的方法,具体取决于您尝试分组的内容。一旦你获得了正确的分组,就可以在同一个模板中输出整个表格,并且你不会遇到开始标记/结束标记问题。

为了帮助我们解决分组任务的问题,请告诉我们输入XML的样子,以及每个表应该对应的内容。 (或者你可以谷歌XSLT分组。)实际上,你正在生成一个表开始标记,然后尝试为名为“node”的$ afdelinger的每个元素子项输出一个表结束标记。这显然不是你的意思。 如果您想要为每个$ afdelinger / node 设置一个单独的表,为什么不将<table>开始标记移动到“medarbejdere”模板中? 如果您只需要一个表格,请将</table>结束标记移至match="/"模板的末尾。

答案 1 :(得分:1)

您已在第一个模板中打开了表格标签,但未在该模板中将其关闭。因此,您的格式错误的XML无效。

<xsl:template match="/">
  <table class="medarbejdere">
    <xsl:for-each select="$afdelinger/node">
      <h3><xsl:value-of select="@nodeName"/></h3>
      <xsl:call-template name="medarbejdere">
        <xsl:with-param name="nodeId" select="@id"/>
      </xsl:call-template>
    </xsl:for-each>
  <!-- MISSING [/table] tag here -->
</xsl:template>

此外,表的子元素必须是以下之一:col, thead, tbody, tfoot, tr h3不是表的有效(直接)子元素