【问题标题】:How to concat XML tags in XSLT-1.0?如何在 XSLT-1.0 中连接 XML 标签?
【发布时间】:2019-08-23 21:53:48
【问题描述】:

我尝试使用此 XSLT-1.0 文件处理 XML 文件。
我想将所有 <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 个&lt;pr&gt; 标签值的单元格。

这是我的 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?应该用什么来区分这 3 个值?
  • 在标题和标签中指定了 XSLT 的版本。

标签: xml xslt xslt-1.0


【解决方案1】:

如果您想将所有三个 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 的上下文中(如您的 sn-p 所示)。

【讨论】:

    【解决方案2】:

    您可以使用以下 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>
    

    它将所有三个&lt;pr&gt; 元素的值连接到一个&lt;td&gt; 元素中。

    如果您想分隔 &lt;pr&gt; 值,只需添加一个

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

    xsl:for-each 循环中的&lt;xsl:value-of select="." /&gt; 之后。

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多