我一直在使用名为Umbraco(umbraco.org)的CMS,并使用SlideShowPro独立产品(www.slideshowpro.net)在网站上显示flash新闻
简而言之,我在管理面板上创建了一个部分,如下所示。
-Flash(有一个xslt文件)
- 月份名称
- 具有图像
的节点
- 具有视频的节点
每个月我都会创建一个月份名称的节点,并为其添加图片和视频。月节点可能包含所有图像或视频,两者都是混合的。 我没有任何输入xml文件导致SlideShowPro Standalone只有一个文件输出所需的flash文件
这是xml文件:
<album id="ssp" lgPath="" tnPath="" title="Album One" description="" tn="">
<img src="1.jpg" id="id1" title="" caption="" link="" target="_blank" pause="" />
<img src="1.f4v" id="id1" tn="" title="" caption="" link="" target="_blank" pause="" vidpreview" />
</album>
我在xslt文件中所做的是;
<xsl:for-each select="$currentPage/node [string(data [@alias='umbracoNaviHide']) != '1']">
<album lgPath="http://localhost" tnPath="http://localhost" title="{data[@alias = 'albumTitle']}" description="{data[@alias = 'albumDescription']}" tn="http://localhost">
<xsl:for-each select="node">
<xsl:if test = "string-length(./data [@alias = 'image']) > 0" >
<img src="{data[@alias = 'image']}" title="{data[@alias = 'title']}" caption="{data[@alias = 'caption']}" link="{data[@alias = 'link']}" target="_blank" pause=""/>
</xsl:if>
<xsl:if test = "string-length(./data [@alias = 'video']) > 0" >
<img src="{data[@alias = 'video']}" tn="http://localhost" title="{data[@alias = 'title']}" caption="{data[@alias = 'caption']}" link="{data[@alias = 'link']}" target="_blank" pause="" vidpreview="/flash/gallery/album2/video/1_preview.png"/>
</xsl:if>
</xsl:for-each>
</album>
</xsl:for-each>
和那个输出
<album lgPath="http://localhost" tnPath="http://localhost" title="" description="" tn="http://localhost"><img src="/media/951/untitled.png" title="örnek" caption="örnek" link="" target="_blank" pause=""/><img src="/media/1026/1.f4v" title="flash" caption="flash" link="" target="_blank" pause=""/></album>
尽管Larsh指出我应该使用statament,但结果是一样的......
答案 0 :(得分:1)
我不确定您的源数据是什么样的,但假设它没有嵌套的&lt; node&gt;元素,问题是第二个xsl:for-each应该是
<xsl:for-each select=".">
因为第一个for-each中的上下文项将是&lt; node&gt;因此,您发布的指令将寻求进一步的子元素。
答案 1 :(得分:0)
Nasılsınız?!
Deniz,看到你的输入XML仍然会很好。看起来您在评论中发布的内容是一些理想的输出XML。发布它的最佳方式是编辑原始问题并将输入XML放在那里,至少是一个样本。
与此同时,我想知道,<node>
元素是否有可能同时具有
<data alias="image">
孩子和 a
<data alias="video">
子?如果是这样,那就可以解释为什么在这些情况下你没有得到<img src="{data[@alias = 'video']}">
输出。
<xsl:choose>
指令只会在每次处理<xsl:when>
时“执行”<xsl:choose>
条指令之一(在这种情况下,<xsl:for-each>
的每次迭代都会执行一次环)。所以如果有一个`数据[@aliasIf你需要能够处理图像数据子项和视频数据子项,请使用
<xsl:if test=...>
代表每个人,而不是
<xsl:choose>
<xsl:when test=...>
如果这不能解决问题,请发布输入XML的示例,并使用“代码”格式化按钮(使用101 010
图标)对其进行格式化。
答案 2 :(得分:0)
更新:@deniz_seaside,请向我们提供XML文档,并在第一时间看到它。
然后,可能,你会再次写下你的转型,这次要好得多。
以下是如何获取您没有的XML文档:只需将此转换应用于此未知文档:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
甚至更短:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
<xsl:for-each select="$currentPage/node [string(data [@alias='umbracoNaviHide']) != '1']">
<album lgPath="http://localhost" tnPath="http://localhost" title="{data[@alias = 'albumTitle']}" description="{data[@alias = 'albumDescription']}" tn="http://localhost">
<xsl:for-each select="node">
第二个<xsl:for-each>
很可能是不正确的。它将选择处理当前节点名为node
的所有节点,该节点也称为node
。通常,名为node
的节点也没有名为node
的子节点。
解决方案是删除第二条<xsl:for-each>
指令,并将其内容(正文)保留在第一条<xsl:for-each>
指令的正文中。
请注意:
由于您没有提供任何源XML文档,因此您的问题很可能是由于天气恶劣。
永远不要将名称node
用于元素,属性或处理指令。您将混淆和提交错误的几率提高了1000倍。