将一个xsl模板输出传递给XSLT中的其他xsl模板输入以进行进一步处理

时间:2015-09-18 16:50:32

标签: xml xslt xslt-2.0

我是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>

有人可以帮我吗?

1 个答案:

答案 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>