2011-10-22 118 views
1

所以我从来没有使用过XSLT,而且我只用XPath作为最简单的形式。 我有一个Xml元素“Earth”,有两个属性Stamina和Willpower。两者都包含数字。 我想要做的是在“地球”一词旁边显示这些属性中最小的值。 我似乎无法锻炼如何在XPath中调用函数。XPath,获取min属性的值

这里是我的XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    version="2.0"> 
    <!--<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 
    --> 

    <xsl:output method="html" indent="yes"/> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:apply-templates select="//Rings"/> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="//Rings"> 
    <h2>Rings</h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Earth</th> 
     <th> 
      <xsl:value-of select="fn:min(fn:number(Earth/@*))"/> 
     </th> 
     </tr> 
     </tr> 
    </table> 
    </xsl:template> 
</xsl:stylesheet> 
+0

我在W3eC上找到的XLST的所有示例都很简单。 –

回答

2

MS Visual Studio预包装了.NET XSLT处理器XslCompiledTransform,这是一个XSLT 1.0处理器。

另一方面,min()是XPath 2.0中的标准功能,而不是XPath 1.0中的标准功能。 XSLT 1.0只使用XPath 1.0。

的XSLT 1.0解决问题:(!因为你没有提供一个)

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="Earth"> 
    <xsl:value-of select= 
     "@*[not(. > ../@*)][1]"/> 
</xsl:template> 
</xsl:stylesheet> 

当这种转变是在下面的XML文档应用:

<Rings> 
<Earth stamina="3" willpower="6"/> 
</Rings> 

想要的,正确的结果产生

3 

在.NET中,可以使用第三方XSLT 2.0处理器,如Saxon.NET或XQSharp。下面是一个XSLT 2.0解决方案:也

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="Earth"> 
    <xsl:sequence select="min(@*)[1]"/> 
</xsl:template> 
</xsl:stylesheet> 
+0

太好了,谢谢。我认为这个例子应该能够解决我需要了解的XSLT。 –

+0

@Oxinabox:不客气。我希望你更需要了解XSLT更多:) –

0

min()功能仅在XSLT 2.0可用。您应该尝试使用2.0处理器(Saxon)。

+0

我正在使用微软视觉工作室2010年(和我认为支持它?) 我知道min()是XSLT 2.0(注意问题标记为,Xpath 2.0) 我以为我使用函数/名称空间错误 –

+0

微软的XSLT处理器,如COM世界中的MSXML 3和MSXML 6以及.NET世界中的XslCompiledTransform都是XSLT 1.0处理器。然而,有第三方的XSLT 2.0实现,即COM世界中的AltovaXML以及.NET世界中的Saxon 9和XQSharp。因此,如果您想在XSLT中使用XPath 2.0函数,那么您需要使用XSLT 2.0处理器。请注意,您可以使用这些功能而不使用前缀。 –

+0

显然,它只有XLST 1与视觉工作室......(编辑:哦,我错过了Martins的帖子) –

2

注意min(number(@*))是XPath 2.0中不正确的 - 你不能数()函数适用于节点序列得到的数字序列。它应该是min(@*/number())。但是,它的输入未经验证,所有属性都将是untypedAtomic,并且min()函数将自动将untypedAtomic值转换为数字。但是,如果有属性不是数字,那么自动转换会导致错误,而使用number()将生成NaN值,这会导致min()的结果为NaN。如果您想要所有这些数字属性的最小值,请尝试min(@*[. castable as xs:double])