2016-07-19 8 views
0

filtert Ich habe die folgende XML. Ich muss einige Elemente basierend auf einem anderen XML-Knoten entfernen.Stylesheet, das die Knoten

Eingang 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> 

Filter xml:

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

diese Verwendung von I Sheets schreiben müssen.

  1. Sheet, das diese drei Filter Filter (diese drei Elemente entfernen) und der Rest der Elemente bevölkern, wie ist.
  2. Stylesheet, das nur diese drei Elemente ausfüllt, die sich im Filter befinden, und den Rest der Elemente entfernen.

Die Liste im Filter kann dynamisch sein. Ich kann mich nicht in meinem xsl hard .. Wie diese

+0

Wenn Sie nur die aufgelisteten Elemente behalten und den Rest entfernen, werden Sie sehr wahrscheinlich mit einem schlecht formatierten XML-Dokument (d. H. Nicht XML) enden. –

+0

Ich stimme zu. Für den zweiten Anwendungsfall muss das oberste Objekt userProfile da sein, was ich vergessen habe zu erwähnen, was es zu einem gültigen XML macht. Und manchmal kann der Objektname anders sein als userProfile. – mnvbrtn

Antwort

1

in Xslt erreichen, um die Elemente zu entfernen, deren Namen in der filter.xml Dokument aufgeführt ist, zu tun:

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> 

Dies setzt voraus, dass alle aufgelisteten Elemente Blattknoten sind (dh keine Kinder haben). Andernfalls würden Sie tun müssen:

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

die aufgeführten Elemente zu entfernen, aber ihre Nachkommen halten (wenn, die das gewünschte Ergebnis ist).