2013-04-27 63 views
3

XML示例文件是:如何使用XPath计算最高值节点和最低值节点之间的差异?

<?xml version="1.0" encoding="UTF-8"?> 
<data> 
    <book num="b1"> 
     <title>book1</title> 
     <author>auth1</author> 
     <price>5</price> 
    </book> 
    <book num="b2"> 
     <title>book2</title> 
     <author>auth2</author> 
     <price>10</price> 
    </book> 
    <book num="b3"> 
     <title>book2</title> 
     <author>auth1</author> 
     <price>12</price> 
    </book> 
</data> 

我需要返回一个值(最高价 - 最低价)。

data/book[not(../book/price> price)]/title 

给我的书的最高价格标题

data/book[not(../book/price<price)]/title 

给我的书的标题用最低的价格

,但我怎么得到价值?

*我还需要返回谁写2个或更多的书 我尝试了所有作者:

//author[count(parent::book)>=1]/text() 

,但没有成功:-(

回答

1

刚刚从最大值减去最小值:

data/book[not(../book/price > price)]/price 
- data/book[not(../book/price < price)]/price 

施加XSLT样式表1.0内

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="data/book[not(../book/price > price)]/price 
          - data/book[not(../book/price &lt; price)]/price" /> 
    </xsl:template> 
</xsl:stylesheet> 

如果你可以用的XPath 2.0,那么你可以使用min()max()功能。一个XSLT内应用2.0样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="max(data/book/price) - min(data/book/price)" /> 
    </xsl:template> 
</xsl:stylesheet> 

要找出发生两次或两次以上的作者,你可以使用以下XPath:

(/data/book/author[../following-sibling::book/author = .])[1] 
+0

谢谢先生。我正在使用:http://emdin.info/r/xpath_checker/我不知道我应该输入什么来获得结果值...你能帮我吗? – BlackMamba 2013-04-28 18:24:37

+0

该网站似乎不适用于任何/所有XPath语句。它可能期望XPath选择并返回一个'node()'。您可能想尝试另一个网站或工具。快速谷歌搜索发现这个工具,它确实产生数字5:http://www.freeformatter.com/xpath-tester.html – 2013-04-28 19:49:28

+0

谢谢先生。一切都像魅力一样工作。 :-) – BlackMamba 2013-04-30 15:10:43

0

如果以前的答案找作者不工作,试试这个:

(/inventory/book/author[(../following-sibling::book/author = .) 

而不是

(../preceding-sibling::book/author = .)])