首页 文章

如何将HTML元素的文本分配给XSLT变量?

提问于
浏览
0

我想创建一个动态XSLT变量 . 它应该获取每行的第一个td的内容,如下所示:

<tr><td>1</td><td>not Important</td></tr>
<tr><td>2</td><td>not Important</td></tr>
<tr><td>3</td><td>not Important</td></tr>

我的XSL:Variable看起来像这样:

<xsl:variable name="name" select="concat('out/',//td[1]/text(),'.html')"/>

我想使用元素内容(在我的案例1,2,3中)来创建新的Html文件并相应地命名它们:

<xsl:result-document href="{$name}">

结果:1.html 2.html 3.html

使用我当前的XSL:Variable Oxygen会给我这个错误:不允许包含多个项目的序列作为concat()的第二个参数

2 回答

  • 0

    如果要将每一行映射到结果文档,那么我建议编写一个模板

    <xsl:template match="tr"> <xsl:result-document href="out{td[1]}.html"> ... </xsl:result-document> </xsl:template>

    然后确保父表有一个 apply-templates ,以确保处理 tr elementd .

  • 0

    你遇到的问题是,concat() - 函数可以将字符串放在一起,但你的语句“// td [1] / text”确实选择了3个字符串,而不仅仅是一个 .

    生成这3个文件名的方法是迭代tr节点并选择每个节点中的第一个td节点:

    <xsl:for-each select="//tr">
        <xsl:variable name="justOneNameAtATime"
            select="concat('out/',.//td[1]/text(),'.html')" />
        <!-- do whatever you want with the single name, e.g.: -->
        <xsl:result-document href="{$name}">
    </xsl:for-each>
    

    注意“//”前面的点,意味着搜索“td” - 节点只会发生在当前上下文中(=“tr” - 节点中) .

相关问题