2017-02-15 38 views
0

所需的元素,我有以下XML刪除空節點,保持人口節點

<exx:XItemLocDesc xmlns:exx="http://www.oracle.com/retail/integration/base/bo/XItemLocDesc/v1"> 
     <exx:XItemLocDtl> 
      <exx:hier_value/> 
      <exx:primary_supp>XXX</exx:primary_supp> 
      <exx:primary_cntry>XXX</exx:primary_cntry> 
      <exx:status>XXX</exx:status> 
      <exx:store_ord_mult>XXXX</exx:store_ord_mult> 
      <exx:receive_as_type/> 
      <exx:taxable_ind/> 
      <exx:ext_uin_ind>XXX</exx:ext_uin_ind> 
      <exx:source_method>XXX</exx:source_method> 
      <exx:source_wh>XXX</exx:source_wh> 
     </exx:XItemLocDtl> 
     <exx:XItemLocDtl> 
      <exx:hier_value/> 
      <exx:primary_supp/> 
      <exx:primary_cntry/> 
      <exx:status/> 
      <exx:store_ord_mult/> 
      <exx:receive_as_type/> 
      <exx:taxable_ind/> 
     </exx:XItemLocDtl> 
     <exx:XItemLocDtl> 
      <exx:hier_value/> 
      <exx:primary_supp/> 
      <exx:primary_cntry/> 
      <exx:status/> 
      <exx:store_ord_mult/> 
      <exx:receive_as_type/> 
      <exx:taxable_ind/> 
     </exx:XItemLocDtl> 
</exx:XItemLocDesc> 

我希望做一個通用的解決方案,以刪除空目錄,但保留「的minOccurs = 1」的元素..

請注意,這些元素是必需的。

<exx:hier_value/> 
<exx:primary_supp/> 
<exx:primary_cntry/> 
<exx:status/> 
<exx:store_ord_mult/> 
<exx:receive_as_type/> 
<exx:taxable_ind/> 

如果我用下面的XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="node()"> 
     <xsl:if test="normalize-space(string(.)) != '' 
         or count(@*[normalize-space(string(.)) != '']) > 0 
         or count(descendant::*[normalize-space(string(.)) != '']) > 0 
         or count(descendant::*/@*[normalize-space(string(.)) != '']) > 0"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:if test="normalize-space(string(.)) != ''"> 
      <xsl:copy> 
       <xsl:apply-templates select="@*" /> 
      </xsl:copy> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

我的結果是

<exx:XItemLocDesc xmlns:exx="http://www.oracle.com/retail/integration/base/bo/XItemLocDesc/v1"> 
    <exx:XItemLocDtl> 
     <exx:primary_supp>XXX</exx:primary_supp> 
     <exx:primary_cntry>XXX</exx:primary_cntry> 
     <exx:status>XXX</exx:status> 
     <exx:store_ord_mult>XXXX</exx:store_ord_mult> 
     <exx:ext_uin_ind>XXX</exx:ext_uin_ind> 
     <exx:source_method>XXX</exx:source_method> 
     <exx:source_wh>XXX</exx:source_wh> 
    </exx:XItemLocDtl> 
</exx:XItemLocDesc> 

,我希望保持必填字段上包含內容的節點..

像這個:

<exx:XItemLocDesc xmlns:exx="http://www.oracle.com/retail/integration/base/bo/XItemLocDesc/v1"> 
     <exx:XItemLocDtl> 
      <exx:hier_value/> 
      <exx:primary_supp>XXX</exx:primary_supp> 
      <exx:primary_cntry>XXX</exx:primary_cntry> 
      <exx:status>XXX</exx:status> 
      <exx:store_ord_mult>XXXX</exx:store_ord_mult> 
      <exx:receive_as_type/> 
      <exx:taxable_ind/> 
      <exx:ext_uin_ind>XXX</exx:ext_uin_ind> 
      <exx:source_method>XXX</exx:source_method> 
      <exx:source_wh>XXX</exx:source_wh> 
     </exx:XItemLocDtl> 
</exx:XItemLocDesc> 

回答

0

這個問題並不完全清楚。請問這樣的事情對你的工作:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="required-names"> 
    <name>exx:hier_value</name> 
    <name>exx:primary_supp</name> 
    <name>exx:primary_cntry</name> 
    <name>exx:status</name> 
    <name>exx:store_ord_mult</name> 
    <name>exx:receive_as_type</name> 
    <name>exx:taxable_ind</name> 
</xsl:variable> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[not(node() or @* or name()=$required-names/name)]"/> 

</xsl:stylesheet> 

注意,存儲所需的名稱作爲合格的名稱(使用已知前綴)是不太理想。一個更好的解決方案將存儲本地名稱和名稱空間URI的組合,所以在前綴改變的情況下它不會受到影響。

+0

我需要刪除空節點,但保留具有某些內容的節點上的必填字段。 – Stack

+0

@Stack我不確定你想說什麼。讓我指出,「空節點」可以用許多不同的方式來解釋。我不打算進入這一點。我的答案僅僅是爲了展示如果節點在「需要」列表中,即使它是「空的」,如何保留該節點。 –