我是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:如果没有name属性的子标记,则删除父标记&#34; fake&#34;如果根本没有父标记,则删除祖父标记(因为父标记将从之前的逻辑中删除)
<?xml version="1.0" encoding="UTF-8"?>
要求:
如果子标签有&#34; name&#34;属性值为&#34; fake&#34;,然后我们应该删除该特定的子标记。所有子标记都可以具有名称属性为&#34; fake&#34;或者没有。 之后检查:
如果在父标记下没有子标记,则还删除父标记,否则只删除名称属性为#34的假标记;假的&#34;并保持真正的孩子与其他标签一起。
如果没有父亲 标记祖父标记然后删除祖父标记。
我的代码分析: 我能够编写xsl,它将删除所有包含name属性的子标记为&#34; fake&#34;。 但是当我为父亲或祖父标记执行相同操作时,它不会考虑删除的子xml(第一个xsl:template的输出),而是使用原始xml模板进行检查。
对于样本输入xml类型1,我的XSL(这将删除具有属性名称的所有子项为&#34;假&#34;),但是当输入类型为样本输入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>
有人可以帮我吗?
答案 0 :(得分:0)
我相信你可以一次完成这一切:
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="*"/>
<!-- 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>