2013-02-28 1 views
0

vient de commencer avec xslt
besoin de retirer l'élément quand il est vide
Qu'est-ce que je fais mal?
plz aider
XSLT 1.0: aide! ne peut pas supprimer l'élément

vient ici un code généré avec ma tentative de résoudre le problème

mon xslt:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" .....>  
<xsl:output method="xml" encoding="UTF-8" indent="yes" 
     xalan:indent-amount="2" /> 
    <xsl:strip-space elements="*" /> 

    <!-- 
     The rule represents a custom mapping: "IdSelectFromDate" to 
     "IdSelectFromDate". 
    --> 
    <xsl:template name="IdSelectFromDateToIdSelectFromDate"> 
     <xsl:param name="IdSelectFromDate" /> 
     <!-- ADD CUSTOM CODE HERE. --> 
     <xsl:choose> 
      <xsl:when test="$IdSelectFromDate = ''"> 
       <xsl:copy> 
        <xsl:apply-templates select="IdSelectFromDate" /> 
       </xsl:copy>    
      </xsl:when>  
      <xsl:otherwise> 
       <xsl:value-of select="IdSelectFromDate" /> 
      </xsl:otherwise> 
     </xsl:choose>  
    </xsl:template> 
    <xsl:template match="IdSelectFromDate" /> 
</xsl:stylesheet> 
entrée

:

<?xml version="1.0" encoding="UTF-8"?> 
<body xmlns:httpsca="http://www.ibm.com/xmlns/prod/websphere/http/sca/6.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="foo.xsd"> 
    <tns:getRealEstateObjects> 
    <RequestElement>   
     <IdNumnet>IdNumnet</IdNumnet> 
     <IdSelectFromDate xsi:nil="true"/> 
    </RequestElement> 
    </tns:getRealEstateObjects> 
</body> 

sortie désirée:

<?xml version="1.0" encoding="UTF-8"?> 
    <body xmlns:httpsca="http://www.ibm.com/xmlns/prod/websphere/http/sca/6.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="foo.xsd"> 
     <tns:getRealEstateObjects> 
     <RequestElement>   
      <IdNumnet>IdNumnet</IdNumnet> 

     </RequestElement> 
     </tns:getRealEstateObjects> 
    </body> 
+0

P.S. supprimer l'élément uniquement lorsqu'il est vide - sinon conserver – Sergey

+0

Votre XML d'entrée n'est pas un espace de noms bien formé (il utilise le préfixe 'tns' qui n'a pas été lié à un URI d'espace de noms), donc XSLT va avoir des problèmes. –

+0

le code xslt ci-dessus est appelé depuis: ' ' – Sergey

Répondre

1

L'approche à utiliser ici est un modèle d'identité avec un modèle pour correspondre à la partie que vous souhaitez supprimer:

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

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="IdSelectFromDate[. = '']" /> 
</xsl:stylesheet> 

Lorsqu'il est exécuté sur votre entrée de l'échantillon, ce produit:

<body xsi:noNamespaceSchemaLocation="foo.xsd" 
     xmlns:httpsca="http://www.ibm.com/xmlns/prod/websphere/http/sca/6.1.0" 
     xmlns:tns="..." 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <tns:getRealEstateObjects> 
    <RequestElement> 
     <IdNumnet>IdNumnet</IdNumnet> 
    </RequestElement> 
    </tns:getRealEstateObjects> 
</body>