xslt 如果不是值,则没有行

xslt if not value, no row

我有这个xml需要改造:

<?xml version="1.0" encoding="utf-8"?>
<racine>
  <index>
    <Parent nom="00000002" Name="" Address="" />
    <Meter numSerie="00000002" />
    <arrêté dateArrêté="28/02/2015 00:00:00">
      <ValeurIndex Libelle="PMAXVALUE0">0.104</ValeurIndex>
    </arrêté>
  </index>
  <index>
    <Parent nom="00000002B" Name="" Address="" />
    <Meter numSerie="" />
    <arrêté dateArrêté="28/02/2015 00:00:00">
      <ValeurIndex Libelle="R1INDEX0">3.754</ValeurIndex>
      <ValeurIndex Libelle="PMAXVALUE0">1.047</ValeurIndex>
    </arrêté>
  </index>
</racine>

进行转换的xslt是:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="ISO-8859-1"/>

<!-- Parcours des noeuds "racine/index" -->
<xsl:variable name="v_separateur">
    <xsl:text>,</xsl:text>
</xsl:variable>

<!-- sort by date desc" --> 
<xsl:template match="/racine">
    <xsl:apply-templates select="index">
        <xsl:sort select="arrêté/@dateArrêté" order="descending" data-type="number"/>
        </xsl:apply-templates>
</xsl:template> 

<xsl:template match="index">        
    <!-- get repeating values once -->
    <xsl:variable name="constants">
        <!-- SP_ID -->
        <xsl:value-of select="Parent/@nom"/>
        <xsl:value-of select="$v_separateur"/>
        <!-- METER_NUMBER-->
        <xsl:value-of select="Meter/@numSerie"/>
        <xsl:value-of select="$v_separateur"/>
        <!-- DATE & TIME-->
        <xsl:value-of select="arrêté/@dateArrêté"/>
        <xsl:value-of select="$v_separateur"/>
    </xsl:variable>
    <!-- Only Process OBIS* values ignore other -->
    <xsl:apply-templates select="arrêté/ValeurIndex[
           @Libelle='EA.R00'
        or @Libelle='EA.R01'
        or @Libelle='EA.R02'
        or @Libelle='EA.R03'
        or @Libelle='EA.R05'
        or @Libelle='EA.R06'
        or @Libelle='EA.R07'
        or @Libelle='EAE.R00'
        or @Libelle='AEINDEX0'
        or @Libelle='AEINDEX1'
        or @Libelle='AEINDEX2'
        or @Libelle='AEINDEX3'
        or @Libelle='AEINDEX5'
        or @Libelle='AEINDEX6'
        or @Libelle='AEINDEX7'
        or @Libelle='R1INDEX0'
        or @Libelle='PMAXVALUE0'
        ]">
        <xsl:with-param name="constants" select="$constants"/>
    </xsl:apply-templates>
    <!-- ADD NEW ROW -->
    <xsl:value-of select="$constants"/>
    <xsl:text>KWH</xsl:text>
    <xsl:value-of select="$v_separateur"/>
    <xsl:value-of select="$v_separateur"/>
    <xsl:choose>
        <xsl:when test="arrêté/ValeurIndex[@Libelle='EA.R00'] > arrêté/ValeurIndex[@Libelle='EA.R02']">
            <xsl:value-of select="arrêté/ValeurIndex[@Libelle='EA.R00']"/>
                <xsl:text>&#xD;&#xA;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="arrêté/ValeurIndex[@Libelle='EA.R02']"/>
                <xsl:text>&#xD;&#xA;</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

<xsl:template match="ValeurIndex"> <!--match="ValeurIndex"-->
    <xsl:param name="constants"/>
    <xsl:value-of select="$constants"/>
    <xsl:choose>
        <xsl:when test="@Libelle = 'EA.R00'">KWH,PUNTA</xsl:when>
        <xsl:when test="@Libelle = 'EA.R01'">KWH,VALLE</xsl:when>
        <xsl:when test="@Libelle = 'EA.R02'">KWH,LLANO</xsl:when>
        <xsl:when test="@Libelle = 'EA.R03'">KW,</xsl:when> 
        <xsl:when test="@Libelle = 'EA.R05'">KWH,</xsl:when> 
        <xsl:when test="@Libelle = 'EA.R06'">KVH,ER_Q2</xsl:when>
        <xsl:when test="@Libelle = 'EA.R07'">KVH,ER_Q3</xsl:when> 
        <xsl:when test="@Libelle = 'EAE.R00'">KVH,ER_Q4</xsl:when>
        <xsl:when test="@Libelle = 'AEINDEX0'">KWH,PUNTA_SA</xsl:when> 
        <xsl:when test="@Libelle = 'AEINDEX1'">KWH,VALLE_SA</xsl:when> 
        <xsl:when test="@Libelle = 'AEINDEX2'">KWH,LLANO_SA</xsl:when> 
        <xsl:when test="@Libelle = 'AEINDEX3'">KWH,</xsl:when> 
        <xsl:when test="@Libelle = 'AEINDEX5'">KWH,ENERSAL</xsl:when> 
        <xsl:when test="@Libelle = 'AEINDEX6'">KW,PUNTA</xsl:when> 
        <xsl:when test="@Libelle = 'AEINDEX7'">KW,VALLE</xsl:when> 
        <xsl:when test="@Libelle = 'R1INDEX0'">KW,LLANO</xsl:when> 
        <xsl:when test="@Libelle = 'PMAXVALUE0'">KW, PUNTA_SA</xsl:when> 
        <xsl:otherwise>
            <xsl:value-of select="Param[@code = 'TYPE_EQP']/@value"/>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="$v_separateur"/>
    <xsl:value-of select="."/>
    <xsl:text>&#xD;&#xA;</xsl:text>
</xsl:template>

</xsl:stylesheet>

我只想得到我们有一些价值的行,所以在这种情况下:

00000002,00000002,28/02/2015 00:00:00,KW, PUNTA_SA,0.104
00000002B,,28/02/2015 00:00:00,KW,LLANO,3.754
00000002B,,28/02/2015 00:00:00,KW, PUNTA_SA,1.047

但是当我们输入 EA.R00 和 EA.R02 的最大值时,我将有一行没有日期和数据。我希望如果这两个值都不存在就不要写任何东西。由于 xslt 是正确的,我将获得:

00000002,00000002,28/02/2015 00:00:00,KW, PUNTA_SA,0.104
00000002,00000002,28/02/2015 00:00:00,KWH,, 
00000002B,,28/02/2015 00:00:00,KW,LLANO,3.754
00000002B,,28/02/2015 00:00:00,KW, PUNTA_SA,1.047
00000002B,,28/02/2015 00:00:00,KWH,,

(我不想看到第2行和第5行)

谢谢

您引用的额外行由注释<!-- ADD NEW ROW -->后的代码输出。您可以做的是将此代码包装在 xsl:if 中以检查 EA.R00EA.R02 是否存在。

试试这个:

<!-- ADD NEW ROW -->
<xsl:if test="arrêté/ValeurIndex[@Libelle='EA.R00' or @Libelle='EA.R02']">
    <xsl:value-of select="$constants"/>
    <xsl:text>KWH</xsl:text>
    <xsl:value-of select="$v_separateur"/>
    <xsl:value-of select="$v_separateur"/>
    <xsl:choose>
        <xsl:when test="arrêté/ValeurIndex[@Libelle='EA.R00'] > arrêté/ValeurIndex[@Libelle='EA.R02']">
            <xsl:value-of select="arrêté/ValeurIndex[@Libelle='EA.R00']"/>
                <xsl:text>&#xD;&#xA;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="arrêté/ValeurIndex[@Libelle='EA.R02']"/>
                <xsl:text>&#xD;&#xA;</xsl:text>
        </xsl:otherwise>
    </xsl:choose>
</xsl:if>