当前位置: 首页 > 知识库问答 >
问题:

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

丌官承
2023-03-14

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

预期输出:如果没有name属性“假”的子标签,则删除父亲标签,如果根本没有父亲标签,则删除祖父标签(因为父亲标签将从早期逻辑中删除)

  <?xml version="1.0" encoding="UTF-8"?>

要求:

如果子标记的“name”属性值为“false”,那么我们应该删除那个特定的子标记。所有子标记的名称属性都可以为“假”或“无”。检查后:

如果父亲标签下没有子标签,则也删除父亲标签,或者删除名称属性为“假”的唯一子标签,并将真正的孩子与其他标签一起保留。

如果祖父标签下没有父亲标签,则删除祖父标签。

我的代码分析:我能够编写xsl,它将删除所有包含name属性为“false”的子标记。但是,当我对父亲或祖父标记执行相同操作时,它不会考虑删除的子xml(第一个xsl:template的输出),而是检查原始xml模板。

对于示例输入xml类型1,我的XSL(这将删除所有属性名称为“假”的子级),但当输入类型为示例输入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个答案

匡祖鹤
2023-03-14

我相信你可以一次性完成这一切:

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>
 类似资料:
  • 问题内容: 我正在建立一个包括条目之间关系的通讯簿。我为个人,公司,场地和角色有单独的模型。在我的索引页面上,我想列出每个模型的所有实例,然后对其进行过滤。这样一个人可以轻松地搜索和查找条目。我已经能够使用通用视图列出单个模型,并使用get_extra_context显示另一个模型: 我还可以使用自定义视图列出单个模型: 这是这两个测试的urls.py: 所以我的问题是“如何修改此参数以将更多模型

  • 问题内容: 尝试访问传递给模板的函数时出现错误: 有人可以让我知道我在做什么错吗? 模板文件(struct.tpl): 调用文件: 这是用于生成struct样板代码的程序(以防万一有人想知道为什么我要在模板中这样做)。 问题答案: 自定义函数需要在解析模板之前进行注册,否则解析器将无法分辨标识符是否为有效的函数名。模板被设计为可静态分析的,这是必需的。 您可以先使用创建一个新的未定义模板,并且除了

  • 问题内容: 哦,我的话我是个傻瓜。 调用函数时,我只是省略了第二个和第三个参数。像个傻瓜。因为那就是我。原来愚蠢的问题如下: 这似乎是它必须做一个很平常的事,但是我无法找到相关的教程,我太无知了约,并弄明白自己。 我的文件中有一个C函数。 (您可能会猜到,我最初的参数为double 而不是void ,但无法弄清楚在Python方面该怎么做。我当然很想将其改回来,但我并不挑剔只要有效。) 我用它制作

  • 我尝试用iText生成一个pdf。首先,我读入一个现有的模板,并在方法中标记公式。邮票法有效。但是我有一个问题,在输出文件中添加更多的公式。 我想为每个公式加盖PDF模板“黄色”。所以我尝试了,但这不起作用。所以我试着用pdf Writer来做这件事。但这对。任何想法我可以用一个公式数据戳pdf模板,制作一个新的页面,并用下一个公式数据戳相同的pdf模板。

  • 我知道接受参数和,所以我已经尝试了2次(失败)来包装函数和args...: a.创建一个C样式的函数,该函数将调用传递给它的对象: 这会在GCC 4.8.5中导致以下错误: /usr/include/c++/4.8.2/functional:在'struct std::_bind_simple(std::_placeholder<1>,int))(int*)>>()>'的实例化中:/usr/inc

  • 问题内容: 我有一个非常基本的模板(basic_template.html),并希望使用使用另一部分模板格式化的数据来填写。basic_template.html可能包含使用部分模板格式化的几件事。 我应该如何在views.py中构建代码? 我这样做的原因是稍后将使用Ajax填充。我这样做对吗? 问题答案: 你可以做: 另一个Django模板在哪里。在这里,你可以放入将用Ajax获得的HTML。