2

変換をしているときに「NULL」を書き込もうとしています。変換は、mysqlデータベースに挿入を行うためのものです。私はこれを試しました:

>     <xsl:if test="incidencia =''"> <xsl:text>'NULL</xsl:text> </xsl:if>

しかし、それは機能しません。

これは私のXMLです:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

    <entregats>
        <envio id="GI-000008">
            <estats totalestats="3">
                <estat datahora="2012-12-02T12:01:55">
                   <IDEstat>CAM</IDEstat>
                   <incidencia> No s ha pogut trobar el cami </incidencia>
                </estat>
                <estat datahora="2012-12-03T12:01:55">
                    <IDEstat>CAM</IDEstat>
                    <incidencia> Destinetari Absent</incidencia>
                </estat>
                <estat datahora="2012-12-04T12:02:55">
                    <IDEstat>CAM</IDEstat>
                    <incidencia> Destinetari Absent </incidencia>
                </estat>

            </estats>

            <receptor>
                <nom>J</nom>
                <cognom>R</cognom>
                <telefon>972510125</telefon>
                <adreca>C/ZopeZope, nº15</adreca>
                <codipostal>19000</codipostal>
            </receptor>

        </envio>
        <envio id="GI-000009">

            <estats totalestats="2">
                <estat datahora="2012-12-01T09:01:55">
                    <IDEstat>CAM</IDEstat>
                </estat>
                <estat datahora="2012-12-01T12:01:55">
                    <IDEstat>ENT</IDEstat>
                </estat>
            </estats>

            <receptor>
                <nom>X</nom>
                <cognom>S</cognom>
                <cognom>P</cognom>
                <telefon>972500025</telefon>
                <adreca>C/Patatones, nº27</adreca>
                <codipostal>17000</codipostal>
            </receptor>

        </envio>
        <envio id="GI-000010">

            <estats totalestats="3">
                <estat datahora="2012-12-05T08:21:57">
                    <IDEstat>CAM</IDEstat>
                </estat>
                <estat datahora="2012-12-06T15:21:57">
                    <IDEstat>CAM</IDEstat>
                </estat>
                <estat datahora="2012-12-07T15:21:57">
                    <IDEstat>ENT</IDEstat>
                </estat>
            </estats>

            <receptor>
                <nom>D</nom>
                <cognom>H</cognom>
                <cognom>P</cognom>
                <telefon>972500125</telefon>
                <adreca>C/Oracle, nº12</adreca>
                <codipostal>17000</codipostal>
            </receptor>

        </envio>

    </entregats>

そしてこれは私のXSLです:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" exclude-result-prefixes="xd" version="1.0">
    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//envio" />
    </xsl:template>

    <xsl:template match="envio">
        <xsl:for-each select="estats/estat">      
    <xsl:text>INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values (</xsl:text>
        <xsl:text>'</xsl:text>
            <xsl:value-of select="../../@id"/><xsl:text>','</xsl:text>           
            <xsl:value-of select="@datahora"/><xsl:text>','</xsl:text> 
            <xsl:value-of select="IDEstat"/><xsl:text>'</xsl:text>
            <xsl:if test="incidencia =''">
                <xsl:text>'NULL</xsl:text>
            </xsl:if>
            <xsl:if test="incidencia !=''">    
              <xsl:text>,'</xsl:text>  <xsl:value-of select="incidencia"/> 
              <xsl:text>'</xsl:text>                
            </xsl:if>                
        <xsl:text>); </xsl:text>    
        </xsl:for-each>             
    </xsl:template> </xsl:stylesheet>

誰かが助けることができれば。

私が得た出力は次のようなものです:

INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000008','2012-12-02T12:01:55','CAM',' No s ha pogut trobar el cami ');
INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000008','2012-12-03T12:01:55','CAM',' Destinetari Absent');
INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000008','2012-12-04T12:02:55','CAM',' Destinetari Absent ');
INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000009','2012-12-01T09:01:55','CAM');
INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000009','2012-12-01T12:01:55','ENT');
INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000010','2012-12-05T08:21:57','CAM');
INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000010','2012-12-06T15:21:57','CAM');
INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values ('GI-000010','2012-12-07T15:21:57','ENT');

そして、発生率でない場合は「NULL」と書く必要があります。

4

2 に答える 2

2

一部のestat要素にはがありincidenciaません。そのような場合、その値のテストはtrueと評価されません。

xsl:if2つの条件をに置き換えて、評価がtrueであるxsl:chooseかどうかを評価できます(要素が存在し、コンテンツnormalize-space(incidencia)がある場合にのみ当てはまります)。それ以外の場合は、を生成します。incidenciatext()'NULL'

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" exclude-result-prefixes="xd" version="1.0">
    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//envio" />
    </xsl:template>

    <xsl:template match="envio">
        <xsl:for-each select="estats/estat">      
            <xsl:text>INSERT INTO HISTORIC_ESTATS (IDEnvio,DATAHORA,IDESTAT,INCIDENCIA) values (</xsl:text>
            <xsl:text>'</xsl:text>
            <xsl:value-of select="../../@id"/><xsl:text>','</xsl:text>           
            <xsl:value-of select="@datahora"/><xsl:text>','</xsl:text>
            <xsl:value-of select="IDEstat"/><xsl:text>'</xsl:text>
            <xsl:text>,</xsl:text>
            <xsl:choose>
                <xsl:when test="normalize-space(incidencia)">
                    <xsl:text>'</xsl:text>  
                    <xsl:value-of select="incidencia"/> 
                    <xsl:text>'</xsl:text>    
                </xsl:when>
                <xsl:otherwise>
                    <!--there is either no incidencia, or it has no value-->
                    <xsl:text>'NULL'</xsl:text>
                </xsl:otherwise>
            </xsl:choose>

            <xsl:text>); </xsl:text>    
        </xsl:for-each>             
    </xsl:template> 
</xsl:stylesheet>
于 2013-01-13T22:01:25.530 に答える
1

ノードの存在をテストしたいので、<xsl:if test="incidencia">の代わりに試してください。<xsl:if test="incidencia =''">

于 2013-01-13T22:00:16.627 に答える