XSLT для объединения пустых значений

У нас есть требование, которое требует от нас перечислить все пустые значения из входящего xml. Я искал, но все, что я мог найти, это перечисление ненулевых значений, попытка использовать это для нашего xml не возвращает требуемых результатов.

Вот xml, который мы получим, и я хочу иметь возможность объединить все нулевые значения из этого xml и распечатать. Любезно помочь.

<?xml version = "1.0" encoding = "UTF-8"?>
<Output>
<Rows>
    <ns0:I2NA xmlns:ns0 = "http://www.example.com/schemas/Schema.xsd">
        <ns0:Organization>108</ns0:Organization>
        <ns0:AccountNumber>1231231231231231233 </ns0:AccountNumber>
        <ns0:Status>0</ns0:Status>
        <ns0:VipStatus>0</ns0:VipStatus>
        <ns0:TypeOfIdNo>1</ns0:TypeOfIdNo>
        <ns0:IdNo>2303111450               </ns0:IdNo>
        <ns0:HomePhone>123456              </ns0:HomePhone>
        <ns0:Employer>                                        </ns0:Employer>
        <ns0:EmployersPhone>123456              </ns0:EmployersPhone>
        <ns0:FaxPhone>123456              </ns0:FaxPhone>
        <ns0:MobileNo>0568520421          </ns0:MobileNo>
        <ns0:CountryCode>   </ns0:CountryCode>
        <ns0:PostalCode>          </ns0:PostalCode>
        <ns0:Position>    </ns0:Position>
        <ns0:MaritalStatus>0</ns0:MaritalStatus>
        <ns0:DateOfBirth>00000000</ns0:DateOfBirth>
        <ns0:EmailAddrs>                                                            </ns0:EmailAddrs>
        <ns0:UserCode1>  </ns0:UserCode1>
        <ns0:NationalityCode>   </ns0:NationalityCode>
        <ns0:NameLine1>ABC     </ns0:NameLine1>
        <ns0:NameLine2>                                        </ns0:NameLine2>
        <ns0:NameLine3>                                        </ns0:NameLine3>
        <ns0:ChDob>        </ns0:ChDob>
        <ns0:AddressLine1>USA                                   </ns0:AddressLine1>
        <ns0:AddressLine2>USA                                   </ns0:AddressLine2>
        <ns0:AddressLine3>USA                                   </ns0:AddressLine3>
        <ns0:AddressLine4>USA                                   </ns0:AddressLine4>
        <ns0:City>                              </ns0:City>
        <ns0:State>   </ns0:State>
        <ns0:GenderCode>0</ns0:GenderCode>
        <ns0:StatementNotifIndi> </ns0:StatementNotifIndi>
        <ns0:Nationality>                    </ns0:Nationality>
        <ns0:County>                              </ns0:County>
        <ns0:LastName>John                             </ns0:LastName>
        <ns0:MiddleName>                                        </ns0:MiddleName>
        <ns0:FirstName>SHAN MATHEW                             </ns0:FirstName>
        <ns0:LangPref>   </ns0:LangPref>
    </ns0:I2NA>
</Rows>
<EOF>true</EOF>

When the XSLT is applied, we would like to receive the below string as output.

Status,Employer,CountryCode,PostalCode,Position,EmailAddrs,UserCode1,NationalityCode,NameLine2,NameLine3,ChDob,City,State,StatementNotifIndi,Nationality,County,MiddleName,LangPref

Спасибо!


person aadi    schedule 08.07.2014    source источник
comment
Вы используете термины «нулевой» и «пустой», но не говорите, что именно вы подразумеваете под ними. Вы используете эти два термина как синонимы?   -  person Michael Kay    schedule 08.07.2014
comment
Да Майкл. Я имею в виду их как синонимы. По сути, я хочу перечислить все пустые элементы и перечислить их, чтобы группа поддержки могла исправить проблемы в потоке и отправить данные без пропущенных элементов. Поскольку каждый из этих элементов является обязательным для обработки на нашем конце.   -  person aadi    schedule 09.07.2014
comment
Хорошо, судя по вашим примерам, пустые и нулевые значения не содержат ничего, кроме пробельных символов. Надо быть точнее...   -  person Michael Kay    schedule 09.07.2014


Ответы (1)


Используйте 1_. Но я не понимаю, почему ваша примерная строка начинается с Status, а XML имеет значение <ns0:Status>0</ns0:Status> для этого поля.

С XSLT 1.0 вам нужно немного больше кода:

<xsl:for-each select="//*[not(*) and not(normalize-space())]">
  <xsl:if test="position() > 1"><xsl:text>.</xsl:text></xsl:if>
  <xsl:value-of select="local-name()"/>
</xsl:for-each>
person Martin Honnen    schedule 08.07.2014
comment
Простите за это. Включение статуса в список опечатка :). Я проверю это и вернусь к вам. Спасибо! - person aadi; 08.07.2014
comment
Большое спасибо, Мартин. Оно работает! Но у меня есть шпаргалка, что он работает, когда я меняю версию xslt на 2.0, а мой TIBCO Designer по умолчанию поддерживает 1.0 (конечно, изменение на 2.0 работает с Saxon -B Xslt, который в настоящее время поддерживает TIBCO). Есть ли аналогичный способ для xslt 1.0? - person aadi; 09.07.2014
comment
@tibuser, я добавил к ответу образец XSLT 1.0. - person Martin Honnen; 09.07.2014