嵌套循环对xslt无法正常工作

时间:2010-09-07 10:09:44

标签: xslt xpath umbraco

我一直在使用名为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']) &gt; 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']) &gt; 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,但结果是一样的......

3 个答案:

答案 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>指令的正文中。

请注意

  1. 由于您没有提供任何源XML文档,因此您的问题很可能是由于天气恶劣

  2. 永远不要将名称node 用于元素,属性或处理指令。您将混淆和提交错误的几率提高了1000倍。