将属性和值从第 4 个父节点填充到 XML 文件的所有父节点

2024-04-11

我是 XSLT 新手,希望将相同的属性和值添加到从第二个父节点开始的所有父节点。这里的逻辑应该是,如果存在主节点,则属性(Mainattribute)应该是一次,并且对于主节点下的所有父节点的其余部分应该具有不同的属性(childattribute),该属性在除主节点之外的所有其他节点上都应该相同。

我们有一个如下所示的输入 xml:它只有一些字段,理想情况下会有更多标签并且可能有所不同。

            <?xml version="1.0" encoding="UTF-8"?>
            <Header>
                <Main>
                    <Parent2>
                        <status>12</status>
                        <statusmsg>Helo</status_text>
                    </Parent2>
                    <Parent3>
                        <Child1>112</Child1>
                        <Child2>Hai</Child2>
                    </Parent3>
                    <Parent4>
                        <Child3>Valley</Child3>
                        <Parent5>
                            <Child7>Kind</Child1>
                            <Child8>Pls</Child2>
                        </Parent5>
                    </Parent4>
                </Main>
            </Header>

输出应如下所示:

        <?xml version="1.0" encoding="UTF-8"?>
        <Header>
            <Main Mainattribute="1">
                <Parent2 childattribute="1">
                    <status>12</status>
                    <statusmsg>Helo</status_text>
                </Parent2>
                <Parent3 childattribute="1">
                    <Child1>112</Child1>
                    <Child2>Hai</Child2>
                </Parent3>
                <Parent4 childattribute="1">
                    <Child3>Valley</Child3>
                    <Parent5 childattribute="1">
                        <Child7>Kind</Child1>
                        <Child8>Pls</Child2>
                    </Parent5>
                </Parent4>
            </Main>
        </Header>

有人可以分享一下 XSLT 吗?我尝试了很多案例但未能实现。谢谢

下面是为第一个主节点尝试的 XSLT,但不知何故出现错误并且无法进一步继续。

        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output indent="yes"/>
            <!-- Template to copy all the elements -->
            <xsl:template match="@*|node()">
                <xsl:copy>
                    <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
            </xsl:template>

            <xsl:template match="Main">
                <Main>
                    <xsl:attribute name="Mainattribute">
                        <xsl:value-of select="1"/>
                    </xsl:attribute>
                    <xsl:apply-templates select="child::node()"/>
                </Main>
            </xsl:template>



        </xsl:stylesheet>

增强@Aniket V的答案,您可以诉诸模式而不是依赖于标签的名称:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="Main">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="Mainattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates mode="parent_mode"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*" mode="parent_mode">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="childattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Update

如果您想要更新所有具有子元素的 XML 元素(但不是顶级元素),那么您可以进行以下转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="Main" priority="1">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="Mainattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[child::* and ancestor::*]">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:attribute name="childattribute"><xsl:value-of select="1"/></xsl:attribute>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:copy>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将属性和值从第 4 个父节点填充到 XML 文件的所有父节点 的相关文章

随机推荐

  • React table v7固定列与react-window

    我有一张带有react table v7 的表 使用react window进行虚拟化 现在表的最后一列已修复 但我无法修复表的最后一列 React window 的内部元素有overflow auto这不会让色谱柱最终变得粘稠 这是lin
  • VisualStateManager WPF 不工作

    我专门在 VS Blend 2017 设计器中设计了一个窗口 没有对 XAML 代码进行任何更改 我创建了一个 StateGroup 和一个 State 并记录了 Button 上的更改 当尝试从代码隐藏应用状态时 没有任何反应 我也看过同
  • 我的基于角色的访问控制是可行的解决方案吗?

    我正在我的 PHP 项目中设计一个非常简单的 RBAC 基于角色的访问控制 系统 经过一番思考后 我想出了一个解决方案 但是对构建业务系统了解不多 我不确定是否有或可能是我的解决方案的任何重大设计缺陷 基本上 我想为用户提供一组 角色 我将
  • 即使关闭 android studio 后,Gradle 仍将 java 作为一个进程

    On mac system whenever i close android studio it leaves java process and java process keep running and keep hogging the
  • MATLAB - 相关属性和计算

    假设我有以下类来计算二次方程的解 classdef MyClass lt handle properties a b c end properties Dependent true x end methods function x get
  • Multer文件上传错误,请求挂起

    我以前从未写过问题 因为我总是在提问之前在这里找到问题的答案 然而 我在 Express 上的文件上传 POST 路由上的 fileFilter 函数上遇到了困难 我在路由中使用了 multer 上传功能 也作为中间件 后面有一个错误处理中
  • httrack wget 卷曲抓取和获取

    互联网上有许多工具可用于下载网站的静态副本 例如 HTTrack 还有许多工具 其中一些是商业工具 用于从网站 抓取 内容 例如 Mozenda 还有一些显然内置于 PHP 和 nix 等程序中的工具 您可以在其中 file get con
  • 如何获取多个输入Python [重复]

    这个问题在这里已经有答案了 我正在用 Python 编写一个程序 我想在其中执行以下操作 我通过写作要求特定的输入 x int input 现在 给定我分配给该输入的数字 N 我将获得 N 行请求新输入 例如 如果我输入数字 3 我希望程序
  • 在正方形内绘制 geom_tile 边框以防止重叠

    我希望能够绘制边界geom tile它们不重叠 因此边界可以传达自己的信息 而不会因边界消失而使观看者感到困惑 library ggplot2 state lt data frame p runif 100 x 1 10 y rep 1 1
  • 如何在 Windows 10 上为 conda 初始化 shell?

    当我跑步时conda init cmd exe在正常或管理模式下 我收到以下错误 WARNING Cannot install xonsh wrapper without a python interpreter in prefix C U
  • 如何在 git 的另一个分支上创建一个分支中的快照副本(提交)?

    当我开始使用 Git 时 我首先了解到的一件事是 Git 并不将信息存储为基于文件的更改 补丁 列表 而是存储为快照流 提交是所有存储库的快照 考虑我们在存储库中有两个分支 Branch A 和 Branch B 无论它们之间的关系如何 它
  • 具有链接到同一主键的多个外键的表 (2)

    只是为了扩展我的上一期 我的数据库中有两个表 我想提取某些信息 下表 player player id primary playerName match match id primary playerID1 playerID2 player
  • 计算一组的比例

    我正在尝试计算数据帧中组总数中每条记录的分数 我的数据如下 我有车站 月份和 PHylum 的因素 然后是总数 我想将总数显示为相对百分比 因此基本上是按车站和月份对总数进行求和 然后应用原始表格 在 R 中 我得到了 bn phyla g
  • Material UI - 更改焦点上文本字段的颜色

    我正在尝试更改文本字段中标签文本的颜色 但我似乎无法弄清楚 这是我正在尝试的
  • 如何在 tkinter 中显示 markdown 格式文本?

    In python 3 x with tkinterGUI 我开发了一个带有常规简单窗口的程序 我想展示一个markdown格式字符串保存在名为的字符串中markdownText在程序窗口上 markdownText italic or b
  • UISegmentedControl 颜色问题 - 颜色在模拟器上显示正常,但在设备上显示不正常

    FIXED 你不会相信它 这是一个 Winterboard 主题搞乱了它 混蛋 禁用主题瞧 效果完美 对于任何感兴趣的人来说 所讨论的主题是 Ayecorn 不酷 希望这对遇到同样问题的其他人有所帮助 抱歉各位 感谢您的所有投入 这里很棒的
  • 如何将复杂的 HTML 表单发布为 JSON?

    我的网页中有一个非常复杂的表单 用户实际上构建了一个复杂的对象 UI 使用 jQuery 进行处理 显示 隐藏部分 复制和删除子表单 尽管可能 但简单地在用户提交时发布表单似乎并不是最好的解决方案 为字段 可以有对象数组 创建唯一的名称并在
  • 将 UINavigationController 添加到现有的 UIViewController

    如何将现有的 UIViewController 使用presentModalViewController 呈现 添加到 UINavigationController 当用户点击按钮时 需要推送我的详细视图的新副本 换句话说 pushView
  • 计算数组属性的内存语义?

    这是一个允许用户标记事物的应用程序 标签只是字符串 一个数组TagHolder对象保存应用程序中使用的所有标签的列表 并用一个布尔值告诉是否选择了该标签 但这是一个实现细节 外部接口调用两个方法 selectedTags and setSe
  • 将属性和值从第 4 个父节点填充到 XML 文件的所有父节点

    我是 XSLT 新手 希望将相同的属性和值添加到从第二个父节点开始的所有父节点 这里的逻辑应该是 如果存在主节点 则属性 Mainattribute 应该是一次 并且对于主节点下的所有父节点的其余部分应该具有不同的属性 childattri