如果element不为空,我想导出http链接。目前我正在使用这个XSLT模板:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="item">
<xsl:value-of select="url1" />
<xsl:text>
</xsl:text>
<xsl:value-of select="url2" />
<xsl:text>
</xsl:text>
<xsl:value-of select="url3" />
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
示例XML:
<rss>
<item>
<name>1</name>
<url1>http://image1.jpg</url1>
<url2></url2>
<url3>http://image3.jpg</url3>
</item>
<item>
<name>2</name>
<url1>http://image1.jpg</url1>
<url2></url2>
<url3></url3>
</item>
</rss>
一切都很好,除了输出中有一个新行:
http://image1.jpg
http://image3.jpg
http://image1.jpg
有没有办法避免这些新线?目前我使用的是linux工具来删除这些行,但直接在XSLT中进行格式化会很不错。
答案 0 :(得分:1)
您可以在复制之前检查元素的内容是否空白
<xsl:template match="item">
<xsl:if test="string-length(url1) > 0">
<xsl:value-of select="url1" />
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:if test="string-length(url2) > 0">
<xsl:value-of select="url2" />
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:if test="string-length(url3) > 0">
<xsl:value-of select="url3" />
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
<强>输出:强>
http://image1.jpg
http://image3.jpg
http://image1.jpg
或者,如果您想要更广泛一点,请使用以下模板:
<xsl:template match="item">
<xsl:for-each select="*[starts-with(local-name(),'url')]">
<xsl:if test="string-length(.) > 0">
<xsl:value-of select="." />
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
答案 1 :(得分:1)
可以在<xsl:template match="...">
内编写其他规则。也许尝试类似的事情:
<xsl:template match="item">
...
</xsl:template>
<xsl:template match="*[not(*) and not(normalize-space())]" />
答案 2 :(得分:1)
请注意,对于XSLT 2或3,如果要输出具有特定分隔符字符串的某些项目,可以使用<xsl:value-of select="select items here" separator="separator string"/>
,这样您的意图和建议的代码可以简化为
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="item">
<xsl:value-of select="*[starts-with(local-name(), 'url') and normalize-space()]" separator=" "/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>