当标签为空时,使用XSL转换写'NULL'

时间:2013-01-13 21:19:53

标签: xml xslt

我正在尝试在进行转换时写'NULL'。 转换是在mysql数据库中进行make插入。 我试过这个:

>     <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');

当我不是一个incidencia时,我需要写'NULL'。

2 个答案:

答案 0 :(得分:2)

您的某些estat元素没有incidencia,并且在这些情况下,您对其值的测试不会评估为true。

您可以使用xsl:if替换两个xsl:choose条件,以评估normalize-space(incidencia)是否计算为true(仅当incidencia元素存在并且具有text()内容),否则生成'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>

答案 1 :(得分:1)

请尝试<xsl:if test="incidencia">而不是<xsl:if test="incidencia =''">,因为您要测试节点是否存在。