我有这个xml代码
<Table entityName="A">
<tgroup cols="6">
<colspec colwidth=".5in"/>
<colspec colwidth=".25in"/>
<colspec colwidth=".25in"/>
<colspec colwidth="5in"/>
<colspec colwidth=".25in"/>
<colspec colwidth="1.25in"/>
<tbody>
<row>
<entry/>
<entry>
<Para>1.</Para>
</entry>
<entry colspan="2">
<Para>Amount paid</Para>
</entry>
<entry/>
<entry/>
</row>
<row>
<entry/>
<entry colspan="3" padding="-1pt 1pt 1pt 1pt">
<Para>seller. . . . . . . . . . . . . . . . . . . . . . . . . . .</Para>
</entry>
<entry align="right" valign="bottom">
<Para>$</Para>
</entry>
<entry align="right" padding="1pt 1pt 1pt 3pt" valign="bottom">
<Para>
<dwNumber>
<DataItem/>
</dwNumber>
</Para>
</entry>
</row>
<row>
<entry/>
<entry/>
<entry>
<Para>a)</Para>
</entry>
<entry>
<Para>allocable</Para>
</entry>
<entry/>
<entry/>
</row>
<row>
<entry/>
<entry/>
<entry colspan="2" padding="-1pt 1pt 1pt 1pt">
<Para>cooperative . . . . . . . . . . . . . . . . . .</Para>
</entry>
<entry align="right" valign="bottom">
<Para>+ $</Para>
</entry>
<entry padding="1pt 1pt 1pt 3pt" valign="bottom">
<Para>
<dwNumber>
<DataItem/>
</dwNumber>
</Para>
</entry>
</row>
<row>
<entry/>
<entry>
<Para>2.</Para>
</entry>
<entry colspan="2">
<Para>Amount paid...........................</Para>
</entry>
<entry>
<Para>
<dwNumber>
<DataItem/>
</dwNumber>
</Para>
</entry>
<entry/>
</row>
</tbody>
</tgroup>
</Table>
当需要通过xsl在单元格中存在时,我需要找到实际的列宽(单元格宽度)。现在我正在做的是计算前面的入口元素并读取colspec元素的colwidth属性。但我不能再这样做,因为有些列是使用entry元素的colspan属性合并的。我需要一种方法来获得前兄弟的colspan属性的总和以及有多少条目元素实际具有colspan属性的计数。
我正在尝试在模板中执行此操作,该模板使我的当前节点为“DataItem”
我对xsl很陌生,并且花了很多时间找到一种方法来做到这一点。
我已经尝试过使用,
<xsl:variable name="i">
<xsl:value-of select="sum(ancestor::entry/preceding-sibling::entry[@colspan > 0])"/>
</xsl:variable>
<xsl:variable name="i">
<xsl:value-of select="sum(ancestor::entry/preceding-sibling::entry/@colspan)"/>
</xsl:variable>
但它似乎对我不起作用。
感谢任何帮助。
谢谢
答案 0 :(得分:1)
如果我没有弄错,可以计算entry
开始的列(从entry
的上下文):
<xsl:variable name="i" select="count(preceding-sibling::entry) + sum(preceding-sibling::entry/@colspan) - count(preceding-sibling::entry/@colspan) + 1"/>
这假设没有rowpans - 否则会变得更加复杂。
这是一个最小化的例子:
<强> XML 强>
<table>
<row name="A">
<cell colspan="3">A1, A2, A3</cell>
<cell>A4</cell>
<cell>A5</cell>
<cell>A6</cell>
</row>
<row name="B">
<cell>B1</cell>
<cell>B2</cell>
<cell colspan="2">B3, B4</cell>
<cell>B5</cell>
<cell>B6</cell>
</row>
<row name="C">
<cell colspan="2">C1, C2</cell>
<cell>C3</cell>
<cell colspan="2">C4, C5</cell>
<cell>C6</cell>
</row>
</table>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="cell">
<cell start-col="{count(preceding-sibling::cell) + sum(preceding-sibling::cell/@colspan) - count(preceding-sibling::cell/@colspan) + 1}">
<xsl:apply-templates/>
</cell>
</xsl:template>
</xsl:stylesheet>
<强>结果强>
<?xml version="1.0" encoding="UTF-8"?>
<table>
<row name="A">
<cell start-col="1">A1, A2, A3</cell>
<cell start-col="4">A4</cell>
<cell start-col="5">A5</cell>
<cell start-col="6">A6</cell>
</row>
<row name="B">
<cell start-col="1">B1</cell>
<cell start-col="2">B2</cell>
<cell start-col="3">B3, B4</cell>
<cell start-col="5">B5</cell>
<cell start-col="6">B6</cell>
</row>
<row name="C">
<cell start-col="1">C1, C2</cell>
<cell start-col="3">C3</cell>
<cell start-col="4">C4, C5</cell>
<cell start-col="6">C6</cell>
</row>
</table>
如果我在计算时进入,这可能是正确的。 但我试图计算2/3级别。来自&#34; DataItem&#34;所以我 必须使用Ancestor :: entry或者其他东西......我仍然无法做到 弄清楚。
这应该会产生很小的不同。首先,您可以在entry
级别计算列数,并将其作为参数传递给它。或者,从entry
的任何后代的上下文中,您可以使用:
<xsl:variable name="preceding-entries" select="ancestor::entry/preceding-sibling::entry" />
<xsl:variable name="i" select="count($preceding-entries) + sum($preceding-entries/@colspan) - count($preceding-entries/@colspan) + 1"/>