2010-12-13 34 views
0
<?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:“:模板XSL”第18行的“表”开始标记的结束标记不匹配。第26行,位置3无法在XSLT中工作表

这是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:[email protected]>[email protected]</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:[email protected]>[email protected]</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:[email protected]>[email protected]</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:[email protected]>[email protected]</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:[email protected]>[email protected]</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:[email protected]>[email protected]</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:[email protected]>[email protected]</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:[email protected]>[email protected]</a></strong></span></span></div> 
    </span></td> 
     <td></td> 
     <td></td> 
    </tr> 
    </table> 

回答

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不是有效的(直接)子表

+0

谢谢,但我如何包裹它周围的表标签呢?我一直在尝试一段时间,但不能真正弄清楚它。 – Daniel 2010-12-13 15:37:52

+0

您需要有一个模板来打开和关闭表格,但是在表格标签内部,可以使用'apply-templates'或' call-template' – scunliffe 2010-12-13 15:39:55

+1

@Daniel,把''放在哪里@scunliffe有'<! - MISSING ... - >'。 (请参阅我的回答。) – LarsH 2010-12-13 18:51:19

3

该错误使得它相当清楚的元素:您有一个模板,其中有一个<table>开始标记但没有结束标记。

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

试图输出开始和结束标记独立通常意味着你正在试图解决的分组问题。有些方法可以实现这一点,XSLT 可以完成,具体取决于您想要分组的内容。一旦你获得了分组的权利,你可以在同一个模板中输出整个表格,并且你不会有开始标签/结束标签问题。

为了让我们能够帮助如何解决分组任务,让我们知道了输入XML是什么样子,以及每个表应该对应。 (或者你可以谷歌的XSLT分组。)就这样,你正在生成一个表开始标记,然后试图为$ afdelinger的每个元素子节点输出一个名为“node”的表结束标记。这显然不是你的意思。 如果你想为每个$ afdelinger /节点一个单独的表,为什么不<table>开始标记移动到“medarbejdere”模板? 如果你只想要一个总表,</table>结束标记移动到match="/"模板结束。

+1

+1好答案。在'medarbejdere'里面移动'table'命名模板内容。 – 2010-12-13 18:31:01

+0

Hi Lars,试图将移动到匹配=“/”模板的末尾,但也抛出错误。也尝试了下面的建议,但现在我有很多h3在页面顶部,然后在下面的表格。我现在要做一个xml转储.. – Daniel 2010-12-14 10:19:47

+0

@Daniel:你会告诉我们错误是什么吗?或者像尼布甲尼撒的梦一样,我们应该弄清楚你有什么错误以及它为什么发生了?请张贴您更新的XSLT以及错误消息。 – LarsH 2010-12-14 16:09:47