带xsl的xpath:测试时

时间:2019-01-02 09:50:30

标签: html xml xslt

我需要在不使用平均值功能(XSLT 1.0)的情况下,在直径大于平均直径或较小的行星上显示BIG。

我尝试在直径> sum(....)div count(nom)之类的条件下使用xsl :,但不起作用:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:template match="/systeme_solaire">
    <html lang="fr">
        <head>
            <title>Les planètes</title>
        </head>
        <body>
            <xsl:apply-templates select="planete[nom!='Terre']">
                <xsl:sort select ="diametre" order="descending" data-type="number" />
            </xsl:apply-templates>
        </body>
    </html>
</xsl:template> 

<xsl:template match="planete" >
    <ul>
        <p><b><xsl:value-of select="nom"/> : </b></p>
        <li>Distance au soleil: <xsl:value-of select="distance"/><xsl:value-of select="distance/@unit"/></li>
        <li>Masse: <xsl:value-of select="masse"/> <xsl:value-of select="masse/@unit"/></li>
        <li>
<xsl:choose>
  <xsl:when test="diametre > ((sum(diametre[unit='diamètre terrestre']*sum(diametre[unit='km']))+sum(diametre[unit='km'])) div count(nom))">
   BIG
  </xsl:when>
  <xsl:otherwise>
   SMALL
  </xsl:otherwise>
</xsl:choose>  Diamètre: <xsl:value-of select="diametre"/> <xsl:value-of select="diametre/@unit"/></li>
        <xsl:if test="satellite>0"><li>Nombre de satellites: <xsl:value-of select="satellite"/></li></xsl:if>
    </ul>
</xsl:template>

</xsl:stylesheet>

使用的XML文件(根据地球直径比定义与地球不同的行星直径):

<?xml version="1.0" encoding="ISO-8859-1" ?>
 
<systeme_solaire>
 
<planete type="tellurique">
    <nom>Vénus</nom>
    <distance unit="UA" >0.7</distance>
    <masse unit="masse terrestre">0.8</masse>
    <diametre unit="diamètre terrestre">0.9</diametre>
</planete>
 
<planete type="tellurique">
    <nom>Terre</nom>
    <distance unit="km" >149600000</distance>
    <masse unit="kg">5.98e24</masse>
    <diametre unit="km">12756</diametre>
    <satellite>1</satellite>
</planete>
 
<planete type="tellurique">
    <nom>Mars</nom>
    <distance unit="UA" >1.5</distance>
    <masse unit="masse terrestre">0.1</masse>
    <diametre unit="diamètre terrestre">0.5</diametre>
    <satellite>2</satellite>
</planete>
 
</systeme_solaire>

1 个答案:

答案 0 :(得分:0)

您有两个问题:

  1. 首先,您需要计算在 模板planete才能到达所有行星,然后通过 模板平均值
  2. 然后,您的xpath不正确:括号错误,unit是一个属性,因此您需要使用@。您需要这样的东西:
    ((sum(//diametre[@unit='diamètre terrestre'])*//diametre[@unit='km'])+//diametre[@unit='km']) div count(//nom)
    编辑:您还需要根据地球直径计算当前行星的实际直径,可以通过添加另一个参数<xsl:with-param name="terre" select="//diametre[@unit='km']"/>并使用它<xsl:when test="diametre*$terre > $avg">

我已经像这样更新了您的XSLT:

解决方案1 ​​

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>

<xsl:template match="/systeme_solaire">
    <html lang="fr">
        <head>
            <title>Les planètes</title>
        </head>
        <body>
            <xsl:apply-templates select="planete[nom!='Terre']">
                <xsl:sort select ="diametre" order="descending" data-type="number" />
                <xsl:with-param name="avg" select="((sum(//diametre[@unit='diamètre terrestre'])*//diametre[@unit='km'])+//diametre[@unit='km']) div count(//nom)"/>
                <xsl:with-param name="terre" select="//diametre[@unit='km']"/>
            </xsl:apply-templates>
        </body>
    </html>
</xsl:template> 

<xsl:template match="planete" >
   <xsl:param name="avg"/>
   <xsl:param name="terre"/>
    <ul>
        <p><b><xsl:value-of select="nom"/> : </b></p>
        <li>Distance au soleil: <xsl:value-of select="distance"/><xsl:value-of select="distance/@unit"/></li>
        <li>Masse: <xsl:value-of select="masse"/> <xsl:value-of select="masse/@unit"/></li>
        <li>
<xsl:choose>
  <xsl:when test="diametre*$terre > $avg">
   BIG
  </xsl:when>
  <xsl:otherwise>
   SMALL
  </xsl:otherwise>
</xsl:choose>  Diamètre: <xsl:value-of select="diametre"/> <xsl:value-of select="diametre/@unit"/></li>
        <xsl:if test="satellite>0"><li>Nombre de satellites: <xsl:value-of select="satellite"/></li></xsl:if>
    </ul>
</xsl:template>

</xsl:stylesheet>

编辑以添加michael建议(以平均直径作为比率):
解决方案2

<xsl:apply-templates select="planete[nom!='Terre']">
    <xsl:sort select ="diametre" order="descending" data-type="number" />
    <xsl:with-param name="avg" select="(sum(//diametre[@unit='diamètre terrestre'])+1) div count(//nom)"/>
</xsl:apply-templates>
...
<xsl:template match="planete" >
   <xsl:param name="avg"/>
   ...
     <xsl:when test="diametre > $avg">
   ...