2017-02-21 3 views
0

私はほとんどXMLの初心者ですが、要素がないと要素を表示しないようにXSLTテンプレートを作成するには、特定のサブ要素が含まれていない場合に要素を削除するためのXSLTテンプレート

私はいくつかの例の入力と所望の出力と、私は下に何を意味するかを説明しようとします

入力:

<shop> 
    <item> 
     <ID>12344</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
     <info> 
      <Attributes> 
       <authcode>DS2978</authcode> 
       <PRICE> 
        <CURRENCY>DKK</CURRENCY> 
        <SALESPRICE>296</SALESPRICE> 
       </PRICE> 
       <Condition>used</Condition> 
       <garanty>Yes</garanty> 
       <garanty_length>2 months</garanty_length> 
       <Label_name>demo</Label_name> 
      </Attributes> 
     </info> 
    </item> 
    <item> 
     <ID>12345</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
    </item> 
</shop> 

所望の出力:

<shop> 
    <item> 
     <ID>12344</ID> 
     <CDKNAMEDK>Dansk CD NAVN</CDKNAMEDK> 
     <CDKNAMEDK>English CD name</CDKNAMEDK> 
     <info> 
      <Attributes> 
       <authcode>DS29783</authcode> 
       <PRICE> 
        <CURRENCY>DKK</CURRENCY> 
        <SALESPRICE>296</SALESPRICE> 
       </PRICE> 
       <Condition>used</Condition> 
       <garanty>Yes</garanty> 
       <garanty_length>2 months</garanty_length> 
       <Label_name>demo</Label_name> 
      </Attributes> 
     </info> 
    </item> 
</shop> 

<info>要素が取り込まれていないのであれば、基本的には、それは全体<item>要素を非表示にします。

私はこれを達成する方法について、私たちにアドバイスを提供してくれることを願っています。おかげ

+0

あなたの入力は整形式ではありませんXML:1つのルート要素がなく、 ''と ''の間に不一致があります(XMLは大文字と小文字を区別します)。あなたの例の 'info'は*属性*ではなく、*要素*であることにも注意してください。 –

+1

これを行う1つの方法は、* identity transform *テンプレートと、 'item [not(info)]'と一致する空のテンプレートを使うことです。 –

+0

私の編集では、要素名の2つを変更しました。つまり、項目を項目に変更し、XMLを整形式にするためにauthcodeEからauthcodeEに変更しました。それを考えてください。 – zx485

答えて

1

この単純なXSLT-1.0テンプレートは、それを行う必要があります。

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

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

    <!-- This template does remove the 'item' elements which do not have 'info' children --> 
    <xsl:template match="item[not(info)]" /> 

</xsl:stylesheet> 

このXSLTは、単純にすべてのノードのidentity templateを適用し、info子供を持たないすべてのitemのノードを無視します。
<xsl:strip-space...は、無視される要素の空白を削除します。

+0

Zx485。どうもありがとう!あなたは私にかなりの時間を節約しました。 – alex

+1

@alex:それを読むのはうれしいです:-)あなたはこの答えを受け入れることによって感謝を強調することができます。 – zx485

関連する問題