祖先兄弟姐妹属性的价值总和

时间:2015-04-30 15:29:09

标签: xml xslt

我有这个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 &gt; 0])"/>
</xsl:variable>


<xsl:variable name="i">
	<xsl:value-of select="sum(ancestor::entry/preceding-sibling::entry/@colspan)"/>
</xsl:variable>

但它似乎对我不起作用。

感谢任何帮助。

谢谢

1 个答案:

答案 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"/>
相关问题