我有一个使用许多变量计算的表。在计算过程中,我会在xml文件中记录这些计算。
问题是我需要在不同的布局中格式化这个xml
在每张“发票”之前,指定了“费用”,该费用可以是发票价值的一部分,每个“费用”都放在表格的一列中。
我的XML是这样的:
<table>
<invoices>
<invoice id="1" value="230" supplier="First supplier"/>
</invoices>
<costs>
<cost id="1" invoice="1" column="2" value="100">
<calculation>
<tenant name="Tenant1" cost="30" />
<tenant name="Tenant2" cost="70" />
</calculation>
</cost>
<cost id="2" invoice="1" column="1" value="130">
<calculation>
<tenant name="Tenant1" cost="50" />
<tenant name="Tenant2" cost="50" />
</calculation>
<calculation>
<tenant name="Tenant1" cost="10" />
<tenant name="Tenant2" cost="20" />
</calculation>
</cost>
</costs>
<columns>
<column id="1" name="Column name 1"/>
<column id="2" name="Column name 2"/>
</columns>
</table>
所以我的预期输出就像是
Column name
Costs from which invoice
Calculations
或
Invoice
Spread over a column based on cost
Calculations
我的XSL看起来像这样:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="table/costs/cost">
<xsl:call-template name="cost"></xsl:call-template>
<h1>Mere</h1>
</xsl:for-each>
</html>
</xsl:template>
<xsl:template match="cost" name="cost">
<xsl:apply-templates select="invoice"></xsl:apply-templates>
<h1>Cheltuiala <xsl:value-of select="@id"></xsl:value-of></h1>
<ul>
<li>
<xsl:call-template name="invoice" >
<xsl:with-param name="idInvoice" select="@invoice"></xsl:with-param>
</xsl:call-template>
</li>
<li>Si ceva avcolo</li>
</ul>
</xsl:template>
<xsl:template name="invoice" match="table/invioces/invoice[@id=@idInvoice]">
<xsl:param name="idInvoice"></xsl:param>
<p>Found something</p>
<h2><xsl:value-of select="@value" /></h2>
</xsl:template>
</xsl:stylesheet>
所以我想做的是根据节点中的属性调用模板,显示数据并继续到下一个节点。
这可能吗?
答案 0 :(得分:1)
您可以使用current()
函数来引用当前上下文节点。但要做到这一点,您需要在调用模板时或之前选择节点:
<xsl:template name="cost">
...
<xsl:for-each match="/table/invoices/invoice[@id=current()/@invoice]">
<xsl:call-template name="invoice"/>
</xsl:for-each>
...
</xsl:template>
@id
引用所选id=
的{{1}}属性。<invoice>
引用了上下文current()/@invoice
的{{1}}属性。使用invoice=
代替<cost>
+ <xsl:apply-templates>
通常更容易,但您必须重写模板才能使用<xsl:for-each>
代替<xsl:call-template>
match=
如果您需要多次使用标记名称,可以使用模式:
name=