XSLT:如何删除除了具有特定值的子节点之外的所有节点?

时间:2017-03-28 15:42:02

标签: xslt xpath xslt-1.0

我试图从XML文件中删除所有不满足某些条件的节点 这是我的简化输入:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<unit xmlns="http://www.srcML.org/srcML/src">
<Rowsets>
    <Rowset>
        <Row>
            <FirstName>Michael</FirstName>
            <LastName>David</LastName>
            <Phone>1234567890</Phone>
        </Row>
        <Row>
            <FirstName>David</FirstName>
            <LastName>Michael</LastName>
            <Phone>01234567890</Phone>
        </Row>
        <Row>
            <FirstName>Yang</FirstName>
            <LastName>Christina</LastName>
            <Phone>2345678901</Phone>
        </Row>
        <Row>
            <FirstName>Grey</FirstName>
            <LastName>Meredith</LastName>
            <Phone>3456789012</Phone>
        </Row>
        <Row>
            <FirstName>Michael</FirstName>
            <LastName>Shepherd</LastName>
            <Phone>5678901234</Phone>
        </Row>
    </Rowset>
</Rowsets>
<Tag>
    <FirstName>Michael</FirstName>
    <LastName>Shepherd</LastName>
    <Phone>5678901234</Phone>
</Tag>
</unit>

我想编写一个XSLT转换文件,该文件将能够删除所有没有FirstName类型子项且价值为Michael的子节点。
对于我刚刚提供的输入,我想获得此输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<unit xmlns="http://www.srcML.org/srcML/src">
        <Row>
            <FirstName>Michael</FirstName>
            <LastName>David</LastName>
            <Phone>1234567890</Phone>
        </Row>
        <Row>
            <FirstName>Michael</FirstName>
            <LastName>Shepherd</LastName>
            <Phone>5678901234</Phone>
        </Row>
    <Tag>
        <FirstName>Michael</FirstName>
        <LastName>Shepherd</LastName>
        <Phone>5678901234</Phone>
    </Tag>
</unit>

这是我现在写的转换文件:

<xsl:stylesheet
xmlns="http://www.srcML.org/srcML/src"
xmlns:src="http://www.srcML.org/srcML/src"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0">

<xsl:template name="removingNotMichael" match="*[child::src:FirstName[.= 'Michael']]">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>

<xsl:template match="@*|node()">
</xsl:template>
</xsl:stylesheet>

它不会产生任何东西,只是一个完全空的文件。 有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

    <xsl:template match="/">
         <unit>
            <xsl:copy-of select="//*[src:FirstName = 'Michael']"/>
         </unit>
    </xsl:template>