XSLT:仅复制几个节点

时间:2016-08-26 03:41:13

标签: xml xslt xslt-grouping

我是XSLT的新手,你能帮忙写一个XSLT语法: 我需要将输入Xml转换为下面显示的输出。我需要选择Id' 9'和' 1'仅

My input XML:
<contacts>
 <contact>
    <id>1234567</id>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    <fields type="array">
        <field id="4" name="Gender">M
        </field>
        <field id="9" name="DOB">10/10/1961
        </field>
        <field id="1" name="Mobile">2132312435
        </field>
        <field id="7" name="E-mail">jon@123.com
        </field>
    </fields>
</contact>
<contact>
    <id>1234567</id>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    <fields type="array">
        <field id="4" name="Gender">M
        </field>
        <field id="9" name="DOB">12/12/1956
        </field>
        <field id="1" name="Mobile">234523452345
        </field>
        <field id="7" name="E-mail">pete@tets.com
        </field>
    </fields>
 </contact>
</contacts>


The output I want:
<contacts>
 <contact>
    <id>1234567</id>
    <firstname>John</firstname>
    <lastname>Smith</lastname>
    <fields type="array">
        <field id="9" name="DOB">10/10/1961
        </field>
        <field id="1" name="Mobile">2132312435
        </field>
    </fields>
</contact>
<contact>
    <id>1234567</id>
    <firstname>Pete</firstname>
    <lastname>Kelly</lastname>
    <fields type="array">
        <field id="9" name="DOB">12/12/1956
        </field>
        <field id="1" name="Mobile">234523452345
        </field>
    </fields>
 </contact>
</contacts>

基本上通过联系循环并获取ID为9和1的id,firstname,lastname和字段。

提前致谢

2 个答案:

答案 0 :(得分:0)

在xsl中,当循环遍历场数组中的字段元素时,可以为选择添加选择条件。

例如:

<xsl:for-each select="field[@id='9' or @id='1']">
  <!-- do something -->
</xsl:for-each>

select =“field [@ id = 9或@ id = 1]”基本上是指选择与条件[@ id = 9或@ id = 1]匹配的字段元素。 @引用一个属性,没有@你将看到field元素中的一个元素。

答案 1 :(得分:0)

简单,您只需要一个身份模板和一个删除不需要的节点的覆盖模板。更像是

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <!-- identity template -->

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

    <!-- If field ID is not equal to 9 and 1, delete it -->
    <xsl:template match="field[@id!=9 and @id!=1]"/>

</xsl:stylesheet>