2014-01-09 18 views
3

Я создаю файлы XML и использую XSLT для удаления любых пустых тегов или атрибутов.Как удалить пустой атрибут

Я недавно запустил модификацию, где мне нужно сохранить определенный атрибут, даже если он пустой/null.

Вот XLST я использовал:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes" /> 
    <xsl:template match="@*|node()"> 
    <xsl:if test=". != ''"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Ниже то, что мой XML раздел должен выглядеть следующим образом.

<patientClinical noClinicalData=""> 
    <orgFacilityCode>000200</orgFacilityCode> 
    <orgPatientId>123456</orgPatientId> 
</patientClinical> 

Я хочу сохранить атрибут noClinicalData, независимо от его значения. В настоящее время, если оно равно нулю или пуст, мой XLST удаляет его и просто оставить

<patientClinical> 
    <orgFacilityCode>000200</orgFacilityCode> 
    <orgPatientId>123456</orgPatientId> 
</patientClinical> 

Это единственный атрибут, я хотел бы сохранить. В другом месте моего XML, если другие атрибуты пусты/null, я хочу, чтобы они были удалены. Есть ли способ изменить мой шаг XLST, чтобы пропустить этот атрибут?

Спасибо за помощь заранее.

ответ

1

Просто добавьте второе условие в этом выражении теста:

<xsl:if test=". != '' or name() = 'noClinicalData'"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:if> 

name() (см reference) Функция возвращает имя текущего узла, и вы можете использовать логические операторы в выражениях (reference).

+1

Спасибо за быстрый ответ и рабочего раствора! – Upstart

+0

@Upstart приветствую вас! –

1

Использование:

<xsl:if test=". != '' or name()='noClinicalData'"> 

Таким образом, ваша личность преобразование выполняется по атрибуту noClinicalData тоже.

В контексте:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:strip-space elements="*"/> 
<xsl:output indent="yes" /> 
<xsl:template match="@*|node()"> 
    <xsl:if test=". != '' or name()='noClinicalData' "> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 
Смежные вопросы