2012-03-02 15 views
0

Я довольно новый для XSLT преобразования и мне нужно, чтобы преобразовать набор данныхУдалить пустые элементы в XML

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" />.

ответ

1

Одной из возможностей является простой оберткой соответствующий бит кода в XSL: если заявление

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

Благодаря вам обоим, им жаль, что я могу принимать только один ответ – klashagelqvist

1

попробовать это:

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>