15

我面临的问题似乎很简单,但作为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 变量来保存连接<company>和分隔符的结果;。如何才能做到这一点?谢谢你。

4

3 回答 3

21

我不相信您可以使用 XSL 变量进行连接,因为一旦设置了变量值,就无法更改。相反,我认为你想要类似的东西:

<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>
于 2012-08-12T02:49:31.717 回答
5

如果您可以使用 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>
于 2012-08-12T03:45:11.033 回答
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>

产生了想要的正确结果(所有公司连接在一起并由 a 分隔;

CBS Records;RCA;Virgin records
于 2012-08-12T03:30:50.423 回答