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

时间:2015-06-21 18:51:11

标签: html xslt-2.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>

My 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 :(得分:0)

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

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

然后确保父表格有apply-templates,以确保处理tr元素。

答案 1 :(得分: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”-node中)。