如何在 XSLT-1.0 中连接 XML 标签?

How to concat XML tags in XSLT-1.0?

我试图用这个 XSLT-1.0 文件处理 XML 文件。
我想在 table.

的同一单元格中连接所有 <pr> 标签

这是我的 XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<cours>
    <sigle>GEN1051</sigle>
    <titre>Ingénierie et entreprises II</titre>
    <prgs>
        <pr>4108</pr>
        <pr>7643</pr>
        <pr>7833</pr>
    </prgs>
    <credits>3</credits>
</cours>

我尝试使用函数 xsl:choosefn:concat,但是当然,这没有用,因为这会生成三个空单元格,而不是一个单元格,其中包含我的 3 个值 <pr> 标签。

这是我的 XSLT 的一部分:

<xsl:for-each select="prgs/pr">
    <xsl:choose>
        <xsl:when test="pr = 1">
            <td>
                <xsl:value-of select="."/>
            </td>
            <xsl:otherwise>
                <td>
                    <xsl:value-of select='concat(pr, pr)'/>
                </td>
            </xsl:otherwise>
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

谁知道这个问题的更好解决方案?

您可以使用以下 XSLT-1.0 样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <!-- Identity template -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="prgs">
        <xsl:copy>
            <td>
                <xsl:for-each select="pr">
                    <xsl:value-of select="." />
                </xsl:for-each>
            </td>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

它的输出是:

<?xml version="1.0"?>
<cours>
    <sigle>GEN1051</sigle>
    <titre>Ingénierie et entreprises II</titre>
    <prgs>
        <td>410876437833</td>
    </prgs>
    <credits>3</credits>
</cours>

它将所有三个 <pr> 元素的值连接到一个 <td> 元素中。

如果您想分隔 <pr> 值,只需将

<xsl:if test="position() != last()"><xsl:text> - </xsl:text></xsl:if>

xsl:for-each 循环中的 <xsl:value-of select="." /> 之后。

如果您想将所有三个 pr 值放在同一个单元格中,您可以简单地执行以下操作:

在 XSLT 1.0 中:

<td>
    <xsl:for-each select="prgs/pr">
        <xsl:value-of select="." />
        <xsl:if test="position() != last()">; </xsl:if>
    </xsl:for-each>
</td>

在 XSLT 2.0 中:

<td>
    <xsl:value-of select="prgs/pr" separator="; "/>
</td>

两者的输出将是:

<td>4108; 7643; 7833</td>

这是假设您处于 cours 的上下文中(如您的代码段所示)。