我想创建一个动态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()
的第二个参数答案 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中)。