- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经查看了几篇分别做这些事情的帖子,但还没有成功地将它们组合在一起。
我有一个类似于这个结构的输入:
<Response>
<Confirmation>Success</Confirmation>
<SecondResponse>
<InquiryResponse>
<ID>99999</ID>
<Confirmation>Success</Confirmation>
<Exception/>
<!-- The following structure repeats a varying amount of times -->
<DataNode1>
<!-- Child nodes could be null, transform should remove null nodes -->
<Child1>data</Child1>
...
<Childn>dataN</Childn>
</DataNode1>
...
<DataNodeN>
<Child1>data</Child1>
...
<Childn>dataN</Childn>
</DataNodeN>
</InquiryResponse>
</SecondResponse>
</Response>
现在,我需要完成以下事情:
1) 复制<InquiryResponse>
的所有子节点(但不是 <InquiryResponse>
本身)
2) 排除 <Confirmation>
和 <Exception>
节点
3) 排除 DataNode 中的任何 null children
4) 在DataNode中插入一个新的子元素
所以期望的输出看起来像这样:
<ID>99999</ID>
<DataNode1>
<Child1>data</Child1>
<ChiildInsert>newData</ChildInsert>
<Childn>dataN</Childn>
</DataNode1>
...
<DataNodeN>
<Child1>data</Child1>
<ChildInsert>newData</ChildInsert>
<Childn>dataN</Childn>
</DataNodeN>
我相信我必须通过为每个 DataNode 创建一个模板(我知道所有可能出现的值)和模板来删除我不想要的节点,然后将它们全部应用到主副本模板来做到这一点忽略空节点。这是我目前使用 2.0 的 XSLT 化身——虽然我知道它还不完全,但这是我所得到的:
<xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- Remove Unwanted Nodes -->
<xsl:template match='Confirmation|Exception'/>
<!-- DataNode Template -->
<template match='DataNode1'>
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<ChildInsert>
<xsl:value-of select='newData'/>
</ChildInsert>
</xsl:copy>
</xsl:template>
<!-- Identity Transform -->
<xsl:template match='@*|node()'>
<xsl:if test='. != ""'>
<xsl:copy>
<xsl:apply-templates select='@*|node()'/>
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这是我使用 Saxon-PE 9.3.0.5 生成的输出
<Response>
<SecondResponse>
<InquiryResponse>
<ID>99999</ID>
<DataNode1>
<Child1>data</Child1>
<ChiildInsert>newData</ChildInsert>
<Childn>dataN</Childn>
</DataNode1>
....
<DataNodeN>...</DataNodeN>
</InquiryResponse>
</SecondResponse>
</Response>
显然,由于我没有指定处理它们的方法,我仍然收到所有的响应;但是,每当我尝试将模板与 XPath 匹配时,我得到的是数据,而不是 XML。我知道我可以通过另一个只复制 <InquiryResponse>
的子节点的转换来传递它,但我觉得应该有更优雅的方式来代替。以下是我仍然面临的问题/问题。
1) 因为使用这样的模板:<xsl:template match='Response'/>
将使我的整个响应无效,我尝试切换标识模板以匹配 Response/SecondResponse/InquiryResponse/*
但结果只生成文本数据,不生成 XML。
2) 当<Exception>
节点填充了一个值,它将继续被复制而不是像 <Confirmation>
那样被删除节点。
3) 如果我想更新一个不为空的子节点的值,我会这样做吗?有一个额外的要求来更新一些子节点,所以我还在考虑如何做,这似乎是正确的方法,但我想验证一下。
<xsl:template match='childNodeA'>
<childNodeA>
<xsl:value-of select='someValue/>
</childNodeA>
</xsl:template>
如果不清楚,我深表歉意,但请随时索取您需要的任何更多详细信息,并在此先感谢您提供的任何帮助。
最佳答案
您发布的输出 XML 格式不正确,因为它没有根元素,但是这个 XSLT 1.0 样式表应该可以满足您的要求:
样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<!-- Identity transform -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Apply all child nodes; don't copy the element itself -->
<xsl:template match="Response | SecondResponse | InquiryResponse">
<xsl:apply-templates/>
</xsl:template>
<!-- Drop elements -->
<xsl:template match="Confirmation | Exception"/>
<xsl:template match="DataNode1 | DataNode2 | DataNodeN">
<xsl:copy>
<!-- Apply Child1, ignore children with no text content -->
<xsl:apply-templates select="Child1[normalize-space(.)]"/>
<!-- Insert new element -->
<ChildInsert>newData</ChildInsert>
<!-- Apply all other child elements except Child1 -->
<xsl:apply-templates select="*[normalize-space(.)][not(self::Child1)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输入:
<Response>
<Confirmation>Success</Confirmation>
<SecondResponse>
<InquiryResponse>
<ID>99999</ID>
<Confirmation>Success</Confirmation>
<Exception/>
<!-- The following structure repeats a varying amount of times -->
<DataNode1>
<!-- Child nodes could be null, transform should remove null nodes -->
<Child1>data</Child1>
<Childn>dataN</Childn>
</DataNode1>
<DataNodeN>
<Child1>data</Child1>
<Childn>dataN</Childn>
</DataNodeN>
</InquiryResponse>
</SecondResponse>
</Response>
输出:
<?xml version="1.0" encoding="utf-8"?>
<ID>99999</ID>
<DataNode1>
<Child1>data</Child1>
<ChildInsert>newData</ChildInsert>
<Childn>dataN</Childn>
</DataNode1>
<DataNodeN>
<Child1>data</Child1>
<ChildInsert>newData</ChildInsert>
<Childn>dataN</Childn>
</DataNodeN>
请注意,由于您没有指定“null”的含义,我假设它是指没有文本内容的元素。所以上面的代码会丢弃一个 <Child1>
像这样的元素:
<Child1>
<GrandChild1/>
</Child1>
关于xslt - 复制 XML,同时排除父节点,删除特定子节点,并覆盖部分子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929804/
我有一个名为“members”的数据库表。分配给成员的是一个职位。 职位 来自部门。我有 Departments,然后是那些中的 Sub-Departments 和 Sub-Departments 中
我正在尝试为 Solr 搜索应用过滤器标记 Tagging_and_excluding_Filters . 挑战在于同时应用多个标记(对于单个页面上的多个选择选项)。例如 q=mainquery&fq
我知道这个问题已经被问过很多次了,我已经尝试了所有建议,并阅读了有关不同选择器等的所有内容,但没有任何对我有用 给出以下 HTML 片段: link
是否有直接的 LINQ 语法来查找集合 B 中不存在的集合 A 的成员?在 SQL 我会写这个 SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID WHERE B
我试图排除并在现有xpath中包括以下xpath,但不太确定如何做到这一点 //exclude -> //*[@id="ires"]/ol/li[6]/div/a[1]/img //include
我有 30 个站点,我需要在其中 24 个站点上回显某些内容。我怎样才能排除其他人?该代码不起作用,因为我认为它的逻辑是假的:) $currentsite = get_bloginfo('wpurl'
我需要对目标文件夹进行检查,并检查文件是否来自今天,并且超过5kb 下面的命令根据使用今天的日期存在的文件来提供bool值,但是我还要添加-gt5kb之类的排除项 我尝试使用-Exlcude,但不确定
我编入索引的Elasticsearch文档包含许多字段。我一直在使用match_all查询来获取结果。我想从match_all中排除一些字段,这可能吗? 最佳答案 在Elasticsearch中,您可
我正在为我的 DAO 编写一些测试,因为很多测试使用保存到我的数据库中的测试对象,所以我使用注释 @Before 和 @Before 创建了 setup() 和teardown() 方法@After
我编写了一个程序来解决以下问题: Implement a diffusion limited aggregation simulation on a toroid plane where seeds
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
很多时候我必须运行这个查询: select * from users where name is not null and name != '' 有没有更好的方法来做到这一点。我需要更多的性能,任何建
如果检测到某个操作系统,是否有一种简单的方法可以排除某些代码? 我设计了一个运行良好的网站(它是一个 sidescroller),当使用滚轮(向上/向下)时,它会左右滚动。但是,如果您使用的是 Mac
我应该如何排除“IN”子句中的值? $Graduates = "45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,6
很明显,如果一个 Mysql 表的全文索引包含一个出现在 50% 的数据行中的关键字,该关键字将被匹配查询忽略 因此,如果我有一个包含 50 个条目的全文索引“content”的表其中 27 个条目在
我有下面的循环。 我需要提取所有不包含字母 p 的名称 (lskey),但我的尝试不起作用。 for(var i = 0; i "); } } 如果有人能回答,我将不胜感激。 最佳答案 如此接
我正在尝试查找 FTP 服务器上根目录的总大小。但是,我无权访问根目录中的其中一个目录。 我想用这个函数对根目录的大小求和: size = 0 for filename in ftp.nlst("."
我有以下正则表达式来匹配 html 链接: 有点效果。除了不是真的。因为它在 编辑: 这将使它只抓取引号而不是 之后的所有内容 最佳答案 我认为您的正则表达式没有按照您的意愿行事。 这会非贪婪地捕
我在提出异常方面遇到困难,例如: import csv o = open('/home/foo/dummy.csv', 'r') # Empty file! reader = csv.reader(o
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!