xsl xpath表达式可以读取自己的模板吗?

时间:2014-03-21 10:22:00

标签: xml xslt xslt-1.0 xsl-variable

我对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应用于自身。

1 个答案:

答案 0 :(得分:1)

你不远了,但表达式必须考虑输入XML的结构:

colspan="{count(//Companies/row[last()]/@*)}"

在您的输入XML中,没有tabletrtd元素。

据我所知,您试图计算在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中完成。