/ / Stylesheet, das die Knoten filtert - xml, xslt, xslt-1.0

Stylesheet, das die Knoten filtert - xml, xslt, xslt-1.0

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

Eingabe 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">johndoe@test.com</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 filtern:

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

Damit muss ich Stylesheets schreiben.

  1. Stylesheet, das diese drei Filter filtert (entfernen Sie diese drei) Elemente) und füllt den Rest der Elemente so wie sie sind.
  2. Stylesheet, das nur die drei Elemente auffüllt, die sich in filter und befinden Entferne die restlichen Elemente.

Die Liste im Filter kann dynamisch sein. Ich kann nicht in meinem xsl hardcode .. Wie man das in xslt erreicht

Antworten:

1 für die Antwort № 1

Um die Elemente zu entfernen, deren Name im aufgeführt ist filter.xml Dokument, mache:

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 (d. H. Keine untergeordneten Elemente haben). Ansonsten müsst ihr folgendes tun:

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

die aufgelisteten Elemente entfernen, aber ihre Nachkommen behalten (ob das ist das gewünschte Ergebnis).