2012-03-02 209 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> 

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

正如你所看到的,即使isacute元素丟失,我也會得到一個空的<Acute></Acute>。如何生成的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 2012-03-02 09:41:30

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>