过滤节点的样式表

时间:2016-07-19 20:26:44

标签: 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. 样式表,仅填充过滤器中的三个元素 删除其余的元素。
  3. 过滤器中的列表可以是动态的。我无法在我的xsl中硬编码。如何在xslt

    中实现这一点

1 个答案:

答案 0 :(得分: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>

删除列出的元素,但保留其后代( if 表示所需的结果)。