XML / XSLT属性输出

时间:2015-04-30 17:39:26

标签: xml xslt xslt-1.0

我正在开发一个小的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

1 个答案:

答案 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>