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

How do I assign the text of HTML Elements to a XSLT Variable?

我想创建一个动态 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 氧气会给我这个错误: 不允许将多个项目的序列作为 concat()

的第二个参数

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

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

然后确保父 table 有一个 apply-templates,确保处理 tr 元素。

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

生成这 3 个文件名的一种方法是遍历 tr 节点并select在每个节点中创建第一个 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"-nodes 只会在当前上下文中发生(= 在 "tr"-node 中)。