我是XSLT中的新手,我需要根据属性值删除几个子节点,然后在属性值下没有子标记的情况下删除其父节点。
,例如示例XML输入类型1:
<?xml version="1.0" encoding="UTF-8"?>
<GrandFather>
<Father>
<Father-bro>Bro</Father-bro>
<Father-sis>Sis</Father-sis>
<Child name="real">Real Children</Child>
<Child name="fake">FakeChildren</Child>
</Father>
</GrandFather>
预期输出:
<?xml version="1.0" encoding="UTF-8"?>
<GrandFather>
<Father>
<Father-bro>Bro</Father-bro>
<Father-sis>Sis</Father-sis>
<Child name="real">Real Children</Child>
</Father>
</GrandFather>
,例如示例XML输入类型2:
<?xml version="1.0" encoding="UTF-8"?>
<GrandFather>
<Father>
<Father-bro>Bro</Father-bro>
<Father-sis>Sis</Father-sis>
<Child name="fake">Real Children</Child>
<Child name="fake">FakeChildren</Child>
</Father>
</GrandFather>
OutPut:如果没有名称属性为“假”的子标记,则移除父标记;如果根本没有父标记,则移除祖父标记(因为父标记将从早期逻辑中删除)
<?xml version="1.0" encoding="UTF-8"?>
Requirement:
如果子标记具有"name“属性值为”value“,那么我们应该删除该特定的子标记。所有子标记都可以具有“假”或“无”的名称属性。在那次检查之后:
如果父标签下没有子标签,那么也移除父标记,否则删除带有名称属性为“假”的独生子标记,并将真实的子标记与其他标记一起保留。
如果祖父标签下没有父亲标签,则移除祖父标签。
My Code:我能够编写xsl,它将删除所有将名称属性包含为“假”的子标记。但是,当我对父标记或祖父标记做同样的操作时,它不会考虑已删除的子xml (第一个xsl: template的输出),而是检查原始的xml模板。
示例输入xml类型1 (这将删除所有属性名为“”的子程序),但当输入类型为样例输入xml 2时,它将不覆盖。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//Child[@name='fake']"/>
</xsl:stylesheet>
有人能帮我吗?
发布于 2015-09-20 10:05:51
我相信你只需一次就能做到这一切:
XSLT1.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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="GrandFather[Father/Child[not(@name='fake')]]"/>
</xsl:template>
<xsl:template match="GrandFather">
<xsl:copy>
<xsl:apply-templates select="Father[Child[not(@name='fake')]]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Child[@name='fake']"/>
</xsl:stylesheet>
https://stackoverflow.com/questions/32657227
复制相似问题