我面临的问题似乎很简单,但作为一个新手 XSL - 我还没有找到合适的解决方案。我想要做的是通过连接 foreach 元素循环的结果来构建一个字符串,稍后我可以将其用作HTML元素属性的值。
假设:
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<country>UK</country>
<company>CBS Records</company>
</cd>
<cd>
<country>USA</country>
<company>RCA</company>
</cd>
<cd>
<country>UK</country>
<company>Virgin records</company>
</cd>
</catalog>
所需的输出:CBS;RCA;Virgin records
我需要 XSLT 代码的有效部分,它将以上述方式执行此转换。我相信我需要一个 xsl-variable 来保存连接<company>
和分隔符;
的结果。如何才能做到这一点?谢谢。
答案 0 :(得分:19)
我不相信你可以使用XSL变量来连接,因为一旦设置了变量值,it can't be changed。相反,我认为你想要这样的东西:
<xsl:for-each select="catalog/cd">
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:value-of select="country"/>
</xsl:when>
<xsl:otherwise>
;<xsl:value-of select="country"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
这对你有意义吗?
编辑:刚刚意识到我可能误读了你打算如何使用这个变量。我上面发布的代码片段可以包含在一个可变元素中供以后使用,如果这就是你的意思:
<xsl:variable name="VariableName">
<xsl:for-each select="catalog/cd">
<xsl:choose>
<xsl:when test="position() = 1">
<xsl:value-of select="country"/>
</xsl:when>
<xsl:otherwise>
;<xsl:value-of select="country"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
答案 1 :(得分:4)
这是一个简单,真实的XSLT解决方案:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="company">
<xsl:value-of select="."/>
<xsl:if test="following::company">;</xsl:if>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<catalog>
<cd>
<country>UK</country>
<company>CBS Records</company>
</cd>
<cd>
<country>USA</country>
<company>RCA</company>
</cd>
<cd>
<country>UK</country>
<company>Virgin records</company>
</cd>
</catalog>
生成了所需的正确结果(所有公司连接在一起并由;
分隔):
CBS Records;RCA;Virgin records
答案 2 :(得分:4)
如果您可以使用XSLT 2.0,则可以使用以下任一方法:
使用string-join()
功能:
<xsl:variable name="companies" select="string-join(catalog/cd/company, ';')" />
将@separator
与xsl:value-of
:
<xsl:variable name="companies" >
<xsl:value-of select="catalog/cd/company" separator=";" />
</xsl:variable>