您好我正在尝试获取具有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.
答案 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>
所以你可以写一个when
,otherwise
案例:)