Удалить пустые элементы в XML - PullRequest
0 голосов
/ 02 марта 2012

Я довольно новичок в преобразовании xslt, и мне нужно преобразовать набор данных

XML из набора данных выглядит следующим образом

<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Componentstatus>
    <tp_ID>1</tp_ID>
    <StatusName>Not inspected</StatusName>
    <tp_Modified>2012-02-28T10:51:32+01:00</tp_Modified>
    <isacute>1</isacute>
  </Componentstatus>
  <Componentstatus>
    <tp_ID>2</tp_ID>
    <StatusName>Acute</StatusName>
    <tp_Modified>2012-02-28T10:51:40+01:00</tp_Modified>
  </Componentstatus>
  <Componentstatus>
    <tp_ID>3</tp_ID>
    <StatusName>See note</StatusName>
    <tp_Modified>2012-02-28T10:51:45+01:00</tp_Modified>
  </Componentstatus>
  <Componentstatus>
    <tp_ID>4</tp_ID>
    <StatusName>Acceptable</StatusName>
    <tp_Modified>2012-02-28T10:52:36+01:00</tp_Modified>
  </Componentstatus>
  <Componentstatus>
    <tp_ID>5</tp_ID>
    <StatusName>Action recommended</StatusName>
    <tp_Modified>2012-02-28T10:53:07+01:00</tp_Modified>
  </Componentstatus>
</NewDataSet>

xslt

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ait.com/componentstatus/">
  <xsl:output method="xml" version="4.0" indent="yes" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
  <xsl:template match="//NewDataSet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">z
    <ComponentStatusList>
      <xsl:for-each select="Componentstatus">
        <Status>
          <xsl:attribute name="StatusId">
            <xsl:value-of select="tp_ID" />
          </xsl:attribute>
          <StatusName>
            <xsl:value-of select="StatusName"/>
          </StatusName>
          <Acute>
            <xsl:value-of select="isacute"/>
          </Acute>
        </Status>
      </xsl:for-each>
    </ComponentStatusList>
  </xsl:template>
</xsl:stylesheet>

И Поколение xml

<?xml version="1.0" encoding="utf-8"?>z
<ComponentStatusList xmlns="http://ait.com/componentstatus/">
  <Status StatusId="1">
    <StatusName>Not inspected</StatusName>
    <Acute>1</Acute>
  </Status>
  <Status StatusId="2">
    <StatusName>Acute</StatusName>
    <Acute></Acute>
  </Status>
  <Status StatusId="3">
    <StatusName>See note</StatusName>
    <Acute></Acute>
  </Status>
  <Status StatusId="4">
    <StatusName>Acceptable</StatusName>
    <Acute></Acute>
  </Status>
  <Status StatusId="5">
    <StatusName>Action recommended</StatusName>
    <Acute></Acute>
  </Status>
</ComponentStatusList>

Как видите, я получаю пустой <Acute></Acute>, даже если отсутствует элемент isacute. Как мне сгенерировать xml и удалить элемент в сгенерированном xml, если элемент отсутствует или хотя бы установить его на <Acute xsi:nil="true" />.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

попробуйте это xslt:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ait.com/componentstatus/">
  <xsl:output method="xml" version="4.0" indent="yes" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
  <xsl:template match="//NewDataSet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <ComponentStatusList>
      <xsl:for-each select="Componentstatus">
        <xsl:variable name="isacute" select="isacute"/>
        <Status>
          <xsl:attribute name="StatusId">
            <xsl:value-of select="tp_ID" />
          </xsl:attribute>
          <StatusName>
            <xsl:value-of select="StatusName"/>
          </StatusName>
          <xsl:if test="$isacute!= ''">
          <Acute>
            <xsl:value-of select="isacute"/>
          </Acute>
          </xsl:if>
        </Status>
      </xsl:for-each>
    </ComponentStatusList>
  </xsl:template>
</xsl:stylesheet>
1 голос
/ 02 марта 2012

Одна возможность состоит в том, чтобы просто обернуть соответствующий бит кода в xsl: if оператор

<xsl:if test="isacute[.]">
    <Acute>    
       <xsl:value-of select="isacute"/>    
   </Acute>   
</xsl:if>

В качестве альтернативы вы можете использовать здесь сопоставление с шаблоном, которое легче расширить, если вы хотите иметь несколько способов вывода элемента.

В вашем случае вместо этого

<Acute>    
    <xsl:value-of select="isacute"/>    
</Acute>   

Замените это на

<xsl:apply-templates select="isacute"/>

И затем иметь шаблоны, соответствующие пустым и непустым кейсам

<xsl:template match="isacute[.]"> <!-- Output element here --> </xsl:template>
<xsl:template match="isacute"/>

Вот полный XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ait.com/componentstatus/">
   <xsl:output method="xml" version="4.0" indent="yes" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>

   <xsl:template match="//NewDataSet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <ComponentStatusList>
         <xsl:for-each select="Componentstatus">
            <Status>
               <xsl:attribute name="StatusId">
                  <xsl:value-of select="tp_ID"/>
               </xsl:attribute>
               <StatusName>
                  <xsl:value-of select="StatusName"/>
               </StatusName>
               <xsl:apply-templates select="isacute"/>
            </Status>
         </xsl:for-each>
      </ComponentStatusList>
   </xsl:template>

   <xsl:template match="isacute[.]">
      <Acute>
         <xsl:value-of select="."/>
      </Acute>
   </xsl:template>

   <xsl:template match="isacute"/>
</xsl:stylesheet>

При применении к вашему образцу XML выводится следующее

<ComponentStatusList xmlns="http://ait.com/componentstatus/">
   <Status StatusId="1">
      <StatusName>Not inspected</StatusName>
      <Acute>1</Acute>
   </Status>
   <Status StatusId="2">
      <StatusName>Acute</StatusName>
   </Status>
   <Status StatusId="3">
      <StatusName>See note</StatusName>
   </Status>
   <Status StatusId="4">
      <StatusName>Acceptable</StatusName>
   </Status>
   <Status StatusId="5">
      <StatusName>Action recommended</StatusName>
   </Status>
</ComponentStatusList>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...