2013-02-28 3 views
0

только что началось с xslt
необходимо удалить элемент, когда он наступает пустой
что я делаю неправильно?
плз помочь
XSLT 1.0: помощь! не может удалить элемент

тут приходит какой-то сгенерированный код с моей попытки решить проблему

мой 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> 

вход:

<?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> 

желаемый результат:

<?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. удалять элемент только тогда, когда он пуст - в противном случае сохранить – Sergey

+0

. Ваш входной XML не является правильно сформированным пространством имен (он использует префикс 'tns', который не был привязан к URI пространства имен), поэтому XSLT будет иметь проблемы с ним. –

+0

Вышеупомянутый код xslt вызывается из: ' ' – Sergey

ответ

1

Правильный подход к использованию здесь шаблон идентичности с шаблоном, чтобы соответствовать той части, которую нужно удалить:

<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> 

При запуске на своем входе образца, это производит:

<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> 
Смежные вопросы