如何在 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:choose
和 fn: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
的上下文中(如您的代码段所示)。
我试图用这个 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:choose
和 fn: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
的上下文中(如您的代码段所示)。