我对colspan
值进行硬编码,但是我可以根据一行中的表格单元格数来计算它,例如使用xsl:variable
?
难点在于,XML节点包含的属性多于我尝试使用XSL显示的属性,因此我不能引用XML本身进行计数。这就是为什么我想知道我是否可以在XSL中引用html模板。
示例XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xsl/allcompanies.xsl"?>
<Companies>
<row Name="Company One" Address="Grote Markt 1" ZIP="1000" City="BRUSSEL" Country="BE" Telephone="02 261 05 55" Fax="" Email="" />
<row Name="Company Two" Address="Tielweg 10" ZIP="2803 PK" City="Gouda" Country="NL" Telephone="" Fax="" Email=""/>
<row Name="Company Three" Address="6 S.Millrock Drive" ZIP="UT 84121" City="Salt Lake City" Country="US" Telephone="+1 801 928 0000" Fax="" Email="" />
</Companies>
XSL:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<html>
<body>
<table>
<tr>
<th colspan="6">Companies</th>
</tr>
<tr>
<th>Name</th>
<th>Address</th>
<th>ZIP</th>
<th>City</th>
<th>Country</th>
<th>Telephone</th>
</tr>
<xsl:for-each select="Companies/row">
<tr>
<td><xsl:value-of select="@Name"/></td>
<td><xsl:value-of select="@Address"/></td>
<td><xsl:value-of select="@ZIP"/></td>
<td><xsl:value-of select="@City"/></td>
<td><xsl:value-of select="@Country"/></td>
<td><xsl:value-of select="@Telephone"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:transform>
我正在思考
的内容<th colspan="{count(//table/tr[last()]/td)}">Companies</th>
但是接下来的事情,你知道......有效。
完全清楚我在这里尝试的东西(设置colspan
)当然是微不足道的,我试图捅一个潜在的问题,{{1}将xslt
应用于自身。
答案 0 :(得分:1)
你不远了,但表达式必须考虑输入XML的结构:
colspan="{count(//Companies/row[last()]/@*)}"
在您的输入XML中,没有table
,tr
和td
元素。
据我所知,您试图计算在XSLT样式表中生成的表格单元格,但也可以从输入XML中检索此信息,这样更直接。
此外,我想知道你为什么要在一个地方动态计算单元格的数量,如果你硬编码应该转换成另一个表格单元格的属性?
编辑:事实证明,您打算询问访问当前样式表节点的理论可能性。是的,有办法做到这一点。
XSLT 1.0
如果您仅限于XSLT 1.0,请使用document()
函数,但不指定要解析的URI:
<xsl:value-of select="count(document('')//td)"/>
Michael Kay&#34; XSLT 2.0程序员参考&#34;表示:
[文档(&#39;&#39;)]指样式表本身。这个构造经常与XSLT 1.0一起使用,它提供了一种方便的方法来维护样式表本身的查找表。
参见例如this类似的问题。
XSLT 2.0
存储有关应将哪些属性转换为xsl:variable
元素中的表格单元格的信息。然后,访问其内容以生成表并确定colspan
属性的值。
实际上,如果你有converting a result tree fragment to a node-set的方法(例如使用EXSLT函数),这也可以在XSLT 1.0中完成。