2015-04-30 102 views
3

我正在处理一个小的XML/XSLT项目,并且无法从XML文件中检索多个元素。XML/XSLT属性输出

我想检索客户端名称(属性)和交易金额(属性),但它不起作用。我可以输出的唯一元素属性是客户端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

你可以添加一个你想要的输出的例子吗? –

+0

当然,它现在在那里! :) –

回答

2

你遇到的问题是你的xpaths。您的上下文是client,因此所有路径必须与此相关。因此,如果您尝试获取子女transactionamount属性,则xpath将为transaction/@amount

但是,如果您使用<xsl:value-of select="transaction/@amount"/>并且有多个transaction孩子,则只会获得第一次出现的值。 (在XSLT 1.0反正在XSLT 2.0,你会得到所有的值连接在一起。)

这是我会怎么做:

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 1.0

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

HTML输出

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    </head> 
    <body> 
     <p>Client: Morton</p> 
     <p>Total: 64</p> 
     <p>Client: Mingus</p> 
     <p>Total: 83</p> 
    </body> 
</html> 
+1

非常感谢或清除起来!我现在可以看到为什么它不起作用,我很感激! :) –

+0

@SimonL。 - 你非常欢迎。第一个优秀问题。 –