2016-07-19 1 views
0

私は以下のXMLを持っています。私は別のXMLノードに基づいていくつかの要素を削除する必要があります。ノードをフィルタリングするスタイルシート

入力XML:

<json:object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://www.ibm.com/xmlns/prod/2009/jsonx"> 
    <json:object name="userProfile"> 
     <json:string name="dob">1940-03-21</json:string> 
     <json:string name="gender">Male</json:string> 
     <json:string name="firstName">John</json:string> 
     <json:string name="lastName">Doe</json:string> 
     <json:string name="Prefix">Mr</json:string> 
     <json:string name="middleName">Jane</json:string> 
     <json:string name="email">[email protected]</json:string> 
     <json:string name="country">USA</json:string> 
     <json:array name="addresses"> 
      <json:object> 
       <json:string name="type">1</json:string> 
       <json:string name="line1">ABCD St</json:string> 
       <json:string name="line2">Unit # 234</json:string> 
       <json:string name="city">Tampa</json:string> 
       <json:string name="state">FL</json:string> 
       <json:string name="country">USA</json:string> 
       <json:string name="zipCode">33637</json:string> 
      </json:object> 
     </json:array> 
     <json:array name="phones"> 
      <json:object> 
       <json:string name="number">1234567890</json:string> 
       <json:string name="type">Home</json:string> 
      </json:object> 
      <json:object> 
       <json:string name="number">1231231230</json:string> 
       <json:string name="type">Cell</json:string> 
      </json:object> 
      <json:object> 
       <json:string name="number">8881212121</json:string> 
       <json:string name="type">Business</json:string> 
      </json:object> 
     </json:array> 
    </json:object> 
</json:object> 

フィルターのxml:私はスタイルシートを記述する必要がこれを使用して

<Filter> 
<Item>gender</Item> 
<Item>email</Item> 
<Item>addresses</Item> 
</Filter> 

  1. これらの3つのフィルタをフィルタリングして(3つの要素を削除して)、残りの要素をそのままにしておくスタイルシート。
  2. フィルタに含まれる3つの要素と、 のみを取り込むスタイルシートは、残りの要素を削除します。

フィルタのリストは動的になる可能性があります。私は、その名前​​文書に記載されて要素を削除するには、XSLT

+0

リストされた要素だけを残して残りの要素をすべて削除すると、不正な形式のXML(つまりXMLではない)文書になる可能性が非常に高くなります。 –

+0

私は同意します。 2番目のユースケースでは、トップオブジェクトuserProfileがそこに存在する必要がありますが、これは忘れてしまいましたが、有効なxmlになります。また、オブジェクト名がuserProfileと異なる場合もあります。 – mnvbrtn

答えて

1

でこれを達成するためにどのように..私のXSLにハードコーディングすることができません。

XSLT 1.0

<xsl:stylesheet version="1.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:param name="filter" select="'filter.xml'"/> 

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

<xsl:template match="*[@name = document($filter)/Filter/Item]"/> 

</xsl:stylesheet> 

これは、リストされたすべての要素がリーフノードである(つまり、子を持たない)ものと仮定します。そうしないと、あなたは何をする必要があるだろう:

<xsl:template match="*[@name = document($filter)/Filter/Item]"> 
    <xsl:apply-templates select="*"/> 
</xsl:template> 

が記載された要素を削除しますが、その子孫を維持するために(望ましい結果だという場合)。

関連する問題