在foreach循环中构建XSLT字符串(变量)

时间:2021-10-30 00:06:18

The problem I'm facing seems simple, but being a novice in everything XSL - I'm yet to find a proper solution. What I want to do is build a string by concatenating the results of a foreach element loop, that I can later on use as a value for an attribute of a HTML element.

我面临的问题似乎很简单,但在XSL的所有内容中都是新手 - 我还没有找到合适的解决方案。我想要做的是通过连接foreach元素循环的结果来构建一个字符串,以后我可以将其用作HTML元素属性的值。

Given:

鉴于:

<?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>

Desired output: CBS;RCA;Virgin records

期望的输出:CBS; RCA;处女记录

I need a valid portion of XSLT code that would perform this transformation in a way described above. I believe I need an xsl-variable that would hold the result of concatenating <company> and a separator character ;. How can this be done? Thank you.

我需要一个有效的XSLT代码部分,它将以上述方式执行此转换。我相信我需要一个xsl-variable来保存连接 和分隔符的结果;如何才能做到这一点?谢谢。

3 个解决方案

#1


13  

I don't believe you can use XSL variables to concatenate, because once a variable value is set, it can't be changed. Instead, I think you want something like:

我不相信你可以使用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>

Does that make sense to you?

这对你有意义吗?

Edit: Just realized I may have misread how you were intending to use the variable. The snippet I posted above can be wrapped in a variable element for later use, if that's what you meant:

编辑:刚刚意识到我可能误读了你打算如何使用变量。我上面发布的代码片段可以包装在一个可变元素*以后使用,如果这是你的意思:

<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>

#2


3  

Here is one simple, true XSLT solution:

这是一个简单,真实的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>

When this transformation is applied on the provided XML document:

在提供的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>

the wanted, correct result (all companies concatenated together and delimited by a ;) is produced:

产生了通缉,正确的结果(所有公司连接在一起并由a分隔;)生成:

CBS Records;RCA;Virgin records

#3


3  

If you can use XSLT 2.0 then either of the following would work:

如果您可以使用XSLT 2.0,则以下任一方法都可以使用:

Use the string-join() function:

使用string-join()函数:

<xsl:variable name="companies" select="string-join(catalog/cd/company, ';')" />

Use @separator with xsl:value-of:

将@separator与xsl:value-of一起使用:

<xsl:variable name="companies" >
   <xsl:value-of select="catalog/cd/company" separator=";" />
</xsl:variable>

#1


13  

I don't believe you can use XSL variables to concatenate, because once a variable value is set, it can't be changed. Instead, I think you want something like:

我不相信你可以使用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>

Does that make sense to you?

这对你有意义吗?

Edit: Just realized I may have misread how you were intending to use the variable. The snippet I posted above can be wrapped in a variable element for later use, if that's what you meant:

编辑:刚刚意识到我可能误读了你打算如何使用变量。我上面发布的代码片段可以包装在一个可变元素*以后使用,如果这是你的意思:

<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>

#2


3  

Here is one simple, true XSLT solution:

这是一个简单,真实的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>

When this transformation is applied on the provided XML document:

在提供的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>

the wanted, correct result (all companies concatenated together and delimited by a ;) is produced:

产生了通缉,正确的结果(所有公司连接在一起并由a分隔;)生成:

CBS Records;RCA;Virgin records

#3


3  

If you can use XSLT 2.0 then either of the following would work:

如果您可以使用XSLT 2.0,则以下任一方法都可以使用:

Use the string-join() function:

使用string-join()函数:

<xsl:variable name="companies" select="string-join(catalog/cd/company, ';')" />

Use @separator with xsl:value-of:

将@separator与xsl:value-of一起使用:

<xsl:variable name="companies" >
   <xsl:value-of select="catalog/cd/company" separator=";" />
</xsl:variable>