xslt中的计数器变量功能

时间:2014-02-14 13:36:32

标签: xml xslt

您好我正在尝试获取具有html类型的文件。我很好。但我的问题是,当没有带有html的文件时,它显示为空。但我想显示一些消息,如“没有提交htmls”。我会在普通编程语言中使用计数器变量。在这里,我无法做到,请帮我解决这个问题。感谢

注意:需要xslt 1.0。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Files>
   <Path class="com.interwoven.cssdk.filesys.CSAreaRelativePath" path="MS/homedemo.html" type="html" />
   <Path class="com.interwoven.cssdk.filesys.CSAreaRelativePath" path="MS/test125.html" type="html" />
   <Path class="com.interwoven.cssdk.filesys.CSAreaRelativePath" path="iwov-resources/css/akz.css" type="css" />
   <Path class="com.interwoven.cssdk.filesys.CSAreaRelativePath" path="iwov-resources/css/animate.css" type="css" />
   <Path class="com.interwoven.cssdk.filesys.CSAreaRelativePath" path="iwov-resources/css/base.css" type="css" />
   <Path class="com.interwoven.cssdk.filesys.CSAreaRelativePath" path="iwov-resources/css/font-awesome-ie7.css" type="css" />
</Files>

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <p>
                <xsl:apply-templates select="//Files" />
            </p>
        </html>
    </xsl:template>
    <xsl:template match="//Files">
        <h1 style="background: #979797;border-radius: 5px;color: #FFF;text-shadow: 1px 1px 1px #000;padding: 5px;font-size:16px;">US files are now live and you can access them using the following URLs:</h1>
        <ol>
            <xsl:for-each select="//Files/Path">        
                <xsl:variable name="type">
                    <xsl:choose>
                        <xsl:when test="@type">
                            <xsl:value-of select="@type" />
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:value-of select="'html'" />
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:variable> 
                <xsl:variable name="path" select="@path" />

                        <xsl:choose>
                            <xsl:when test="$type='html'">
                                <li>    
                                    <a class="iw-base-link">
                                        <xsl:attribute name="href">
                                            <xsl:value-of select="$path"/>
                                        </xsl:attribute>
                                        <xsl:value-of select="$path" />
                                    </a>
                                </li>
                            </xsl:when>
                        </xsl:choose>
            </xsl:for-each>                         
        </ol>
        </xsl:template>
</xsl:stylesheet>

当我们输入html文件时,请显示以下内容:

US files are now live and you can access them using the following URLs:

1.MS/homedemo.html
2.MS/test125.html

当我们没有类型的html文件时,请显示以下内容:

US files are now live and you can access them using the following URLs:

NO html files were submitted.

3 个答案:

答案 0 :(得分:4)

您的XSLT比它需要的要复杂一些。而不是在每个路径上执行 xsl:for-each ,然后在类型的循环内添加测试,将逻辑添加到的“选择”中xsl:for-each 本身

<xsl:for-each select="Path[@type='html' or not(@type)]">

请注意,相对于您当前所在的 Files 元素,这是一个“相对”表达式。

这意味着您不需要循环中类型的变量声明,或 xsl:choose 。更重要的是,它确实意味着您实际上可以使用变量来保存您想要迭代的节点

 <xsl:variable name="files" select="Path[@type='html' or not(@type)]" />  

然后,您可以使用 xsl:choose 来检查是否有任何节点

    <xsl:choose>
       <xsl:when test="count($files) = 0">
          No files
       </xsl:when>
       <xsl:otherwise>
          <!-- You existing loop here -->
       </xsl:otherwise>
    <xsl:choose>

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <p>
                <xsl:apply-templates select="//Files" />
            </p>
        </html>
    </xsl:template>
    <xsl:template match="//Files">
        <xsl:variable name="files" select="Path[@type='html' or not(@type)]" />
        <xsl:choose>
           <xsl:when test="count($files) = 0">No files</xsl:when>
           <xsl:otherwise>
        <h1 style="background: #979797;border-radius: 5px;color: #FFF;text-shadow: 1px 1px 1px #000;padding: 5px;font-size:16px;">US files are now live and you can access them using the following URLs:</h1>
        <ol>
            <xsl:for-each select="$files">        
                <xsl:variable name="path" select="@path" />
                 <li>    
                     <a class="iw-base-link" name="{$path}">
                         <xsl:value-of select="$path" />
                     </a>
                 </li>
            </xsl:for-each>
        </ol>
        </xsl:otherwise>
        </xsl:choose>
        </xsl:template>
</xsl:stylesheet>

还要注意在创建超链接时使用“属性值模板”,以使XSLT更简单。花括号表示要计算的表达式而不是字面输出。

答案 1 :(得分:2)

某些事情(很多)更简单?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="HTMLfiles" select="/Files/Path[@type='html']" />

<xsl:template match="/">
<html>
<xsl:choose>
    <xsl:when test="$HTMLfiles">
        <h1 style="background: #979797;border-radius: 5px;color: #FFF;text-shadow: 1px 1px 1px #000;padding: 5px;font-size:16px;">US files are now live and you can access them using the following URLs:</h1>
        <ol>    
            <xsl:apply-templates select="$HTMLfiles" />
        </ol>
        </xsl:when>
    <xsl:otherwise>
        <h1 style="background: #979797;border-radius: 5px;color: #FFF;text-shadow: 1px 1px 1px #000;padding: 5px;font-size:16px;">NO html files were submitted.</h1>
    </xsl:otherwise>
</xsl:choose>
</html>
</xsl:template>

<xsl:template match="Path">
    <li>    
        <a class="iw-base-link">
            <xsl:attribute name="href">
                <xsl:value-of select="@path"/>
            </xsl:attribute>
            <xsl:value-of select="@path" />
        </a>
    </li>
</xsl:template>

</xsl:stylesheet>

请注意,您的XSLT会在<h1>元素中放置<p>;我不确定这是件好事。

答案 2 :(得分:1)

xpath中实际上有一个count()函数:

<ol>
    <xsl:choose>
        <xsl:when test="count(//Files/Path) > 0">
            <xsl:for-each select="//Files/Path">        
                ..........
            </xsl:for-each>   
        </xsl:when>
        <xsl:otherwise>
                NO html files were submitted.
        </xsl:otherwise>
    </xsl:choose>
</ol>

所以你可以写一个whenotherwise案例:)