/ / таблиця стилів, яка фільтрує вузли - xml, xslt, xslt-1.0

Таблиця стилів, яка фільтрує вузли - xml, xslt, xslt-1.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">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:

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

За допомогою цього я маю писати таблиці стилів.

  1. Таблиця стилів, яка фільтрує ці три фільтри (видаліть ці три елементи) і заповнити решту елементів, як є.
  2. Таблиця стилів, яка заповнює лише ті елементи, які знаходяться в фільтрі та видаліть інші елементи.

Список у фільтрі може бути динамічним. Я не можу жорстко в моєму xsl .. Як це досягти в xslt

Відповіді:

1 для відповіді № 1

Видалити елементи, назви яких вказано в filter.xml документ:

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>

видалити перераховані елементи, але зберігати своїх нащадків (якщо це бажаний результат).