如果另一个标记为空,则使用XSLT从XML文件中删除标记

时间:2014-11-05 23:20:57

标签: xml xslt

我不知道如何为此编写XSLT。

这是我的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
    <firstname>Mike</firstname>
    <lastname>Hewitt</lastname>
    <licenses/>
    <license-details>
        <tag1>xyz</tag1>
    </license-details>
</person>
<person>
    <firstname>Mike</firstname>
    <lastname>Hewitt</lastname>
    <licenses>
        <state>NY</state>
    </licenses>
    <license-details>
        <tag1>xyz</tag1>
    </license-details>
</person>
</people>

我想要实现的是,如果license-details标记为空,我想删除licenses标记

这是输出的方式:

<?xml version="1.0" encoding="UTF-8"?>
<people>
<person>
    <firstname>Mike</firstname>
    <lastname>Hewitt</lastname>
</person>
<person>
    <firstname>Mike</firstname>
    <lastname>Hewitt</lastname>
    <licenses>
        <state>NY</state>
    </licenses>
    <license-details>
        <tag1>xyz</tag1>
    </license-details>
</person>
</people>

有人可以指导我如何为此编写XSLT,我使用的是XSLT 1.0版

1 个答案:

答案 0 :(得分:2)

您可以删除节点的一​​种方法如下:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml"  
                omit-xml-declaration="no" 
                encoding="UTF-8" indent="yes" />
    <xsl:strip-space  elements="*"/>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="licenses[count(node())=0] | 
                license-details[count(./preceding-sibling::licenses/node())=0]"/>
</xsl:stylesheet>

XML输出:

<?xml version="1.0" encoding="UTF-8"?>
<people>
   <person>
     <firstname>Mike</firstname>
     <lastname>Hewitt</lastname>
   </person>
   <person>
     <firstname>Mike</firstname>
     <lastname>Hewitt</lastname>
     <licenses>
       <state>NY</state>
     </licenses>
     <license-details>
       <tag1>xyz</tag1>
     </license-details>
   </person>
</people>

最后一个模板匹配没有子节点的所有licenses - licenses[count(node())=0] - 以及所有license-details具有前一个兄弟licenses且没有任何子节点的license-details[count(./preceding-sibling::licenses/node())=0] - {{1}} 。因为这个空模板不产生输出,所以两者都不会被写入输出。

Demo