我正在开发一个小的XML / XSLT项目,但我无法从XML文件中检索多个元素。
我想检索客户端名称(属性)和交易金额(属性),但它不起作用。我可以输出的唯一元素属性是client name
。
我尝试将<xsl:template match="client">
更改为<xsl:template match="list">
,但随后一切都在显示,我不想打印问题元素。
一旦输出了名称和金额,我需要将金额相加以显示总金额,但首先我需要获得输出金额。有什么想法吗?
XML文件:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="xslt.xml"
type="application/xml"?>
<list>
<client name="Morton">
<transaction amount="43" />
<question>Who?</question>
<transaction amount="21" />
</client>
<client name="Mingus">
<transaction amount="6" />
<transaction amount="32" />
<question>Where?</question>
<transaction amount="45" />
</client>
</list>
XSLT文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="client">
<html>
<body>
<p>Name:</p>
<xsl:apply-templates select="client" />
<xsl:value-of select="client" />
<xsl:value-of select="@name" />
<p>Total:</p>
<xsl:value-of select="transaction" />
<xsl:value-of select="@amount" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>
当前输出结果:
Client:
Morton
Total:
Client:
Mingus
Total:
所需的输出结果:
Client: Morton
Total: 64
Client: Mingus
Total: 83
答案 0 :(得分:2)
您遇到的问题是您的xpath。您的上下文为client
,因此所有路径都必须相对于此。因此,如果您尝试获取子amount
的{{1}}属性,则xpath将为transaction
。
但是,如果您使用transaction/@amount
并且有多个<xsl:value-of select="transaction/@amount"/>
子项,则您只会获得第一次出现的值。 (无论如何,在XSLT 1.0中。在XSLT 2.0中,你将所有的值连接在一起。)
我将如何做到这一点:
XML输入
transaction
XSLT 1.0
<list>
<client name="Morton">
<transaction amount="43" />
<question>Who?</question>
<transaction amount="21" />
</client>
<client name="Mingus">
<transaction amount="6" />
<transaction amount="32" />
<question>Where?</question>
<transaction amount="45" />
</client>
</list>
HTML输出
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="html"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/list">
<html>
<head></head>
<body>
<xsl:apply-templates select="client"/>
</body>
</html>
</xsl:template>
<xsl:template match="client">
<p>Client: <xsl:value-of select="@name"/></p>
<p>Total: <xsl:value-of select="sum(transaction/@amount)"/></p>
</xsl:template>
</xsl:stylesheet>