假设我的XML文件的结构是:
<?xml version="1.0" encoding="ISO-8859-1"?>
<main>
<_All>
<_999999>
<Employee_Amount>10.0</Employee_Amount>
<Cash_Count>10.0</Cash_Count>
<Dine_in_Amount>10.0</Dine_in_Amount>
<Promos_Actual>10.0</Promos_Actual>
<Combo_Savings_Amount>10.0</Combo_Savings_Amount>
<total_sales>10.0</total_sales>
</_999999>
<_test>
<Employee_Amount>20.0</Employee_Amount>
<Cash_Count>20.0</Cash_Count>
<Dine_in_Amount>20.0</Dine_in_Amount>
<Promos_Actual>20.0</Promos_Actual>
<Combo_Savings_Amount>20.0</Combo_Savings_Amount>
<total_sales>20.0</total_sales>
</_test>
</_All>
</main>
我必须对所有节点求和(例如-两个节点的Cash_Count,两个节点的total_sales),节点名称可以更改,因此我不能使用其名称进行导航。我尝试过for-each,但我坚持使用xpath表达式。因为我是xslt 1.0的新手,请同样帮助我。
在proskor在答案中建议的帮助下,我尝试了下面的xslt:
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/*">
<table border="1" cellspacing="1" cellpadding="1">
<tr>
<xsl:apply-templates select="/*/*/*" mode="wrap"/>
</tr>
<tr>
<td><xsl:value-of select="name(child::*)"/></td>
<td> </td>
<xsl:for-each select="/*/*/*/*[current()]">
<xsl:variable name="pos" select="position()" />
<td> <xsl:value-of select="sum(/*/*/*/*[$pos])" /></td>
</xsl:for-each>
</tr>
<xsl:apply-templates select="/*/*/*" mode="values"/>
</table>
</xsl:template>
<xsl:template match="/*/*/*" mode="wrap">
<xsl:if test="position() = 1">
<th>Region</th>
<th>Store</th>
<xsl:for-each select="./*">
<th><xsl:value-of select="name()"/></th>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template match="/*/*/*" mode="values">
<xsl:for-each select=".">
<tr>
<td> </td>
<td><xsl:value-of select="name()"/></td>
<xsl:for-each select="./*">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
可以正常工作,但是输出额外的td值为0。由于有6个节点,因此有6个额外的td值为0。求和后,tr看起来像这样..
<tr>
<td>30</td>
<td>30</td>
<td>30</td>
<td>30</td>
<td>30</td>
<td>30</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
请任何人帮助解决这个问题。由于
将第14行xsl:for-each元素的select-attribute更改为"/*[1]/*[1]/*[1]/*"
:
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:template match="/*">
<table border="1" cellspacing="1" cellpadding="1">
<tr>
<xsl:apply-templates select="/*/*/*" mode="wrap"/>
</tr>
<tr>
<td><xsl:value-of select="name(child::*)"/></td>
<td> </td>
<xsl:for-each select="/*[1]/*[1]/*[1]/*">
<xsl:variable name="pos" select="position()" />
<td> <xsl:value-of select="sum(/*/*/*/*[$pos])" /></td>
</xsl:for-each>
</tr>
<xsl:apply-templates select="/*/*/*" mode="values"/>
</table>
</xsl:template>
<xsl:template match="/*/*/*" mode="wrap">
<xsl:if test="position() = 1">
<th>Region</th>
<th>Store</th>
<xsl:for-each select="./*">
<th><xsl:value-of select="name()"/></th>
</xsl:for-each>
</xsl:if>
</xsl:template>
<xsl:template match="/*/*/*" mode="values">
<xsl:for-each select=".">
<tr>
<td> </td>
<td><xsl:value-of select="name()"/></td>
<xsl:for-each select="./*">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>