【问题标题】:Can xsl xpath expression read its own template?xsl xpath 表达式可以读取自己的模板吗?
【发布时间】:2014-04-28 15:50:32
【问题描述】:

我正在硬编码 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)当然是微不足道的,我试图探讨一个潜在的问题,即xslt 在其自身上应用XPath

【问题讨论】:

  • 表格单元格的数据来自哪里?请添加一个示例输入 XML,以便人们可以对其进行实际测试。
  • @MathiasMüller 我已经编辑了这个问题以包含一些示例 XML,尽管我倾向于说,对于这个问题,它完全无关紧要。

标签: xml xslt xslt-1.0 xsl-variable


【解决方案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 的“XSLT 2.0 程序员参考”说:

[document('')] 指的是样式表本身。这种结构经常与 XSLT 1.0 一起使用,它提供了一种方便的方式来维护样式表本身中的查找表。

请参阅例如 this 类似的 SO 问题。

XSLT 2.0

xsl:variable 元素中存储有关哪些属性应转换为表格单元格的信息。然后,访问其内容以生成表格并确定colspan 属性的值。

实际上,这也可以在 XSLT 1.0 中完成,如果您有 converting a result tree fragment to a node-set 的方法(例如,使用 EXSLT 函数)。

【讨论】:

  • 对不起,我忘了说 xml 包含的属性比 html 模板每行的表格单元格要多。我正在尝试获取模板中的表格单元格本身,而不是 xml 中的单元格!
  • 仍然是手动选择应该转换为表格单元格的属性。那么,为什么不手动插入colspan 属性的值呢?
  • 我承认它没有什么实际用途。这只是为了获得洞察力并找出是否可能。
  • 您的回答为我指明了我想要的确切方向。我最终使用&lt;th colspan="{count(document('')//tr[last()]/td)}"&gt;Companies&lt;/th&gt; 得到了想要的结果。衷心感谢!
  • 不客气。另外,我很高兴我们终于互相了解了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2012-03-30
  • 2010-09-29
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 2019-08-06
相关资源
最近更新 更多