Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >XSLT2.0中XML到XML内部节点结构的转换

XSLT2.0中XML到XML内部节点结构的转换
EN

Stack Overflow用户
提问于 2018-01-24 09:33:56
回答 1查看 156关注 0票数 0

我已经尝试解决这个问题有一段时间了。

我有一个xml文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ParentNode>
 <RequirementGroup>
    <ID>id1</ID>
    <Requirement>
        <ID>id2</ID>
        <Description>value1</Description>
    </Requirement>
    <RequirementGroup pi="attribute">
        <ID>id3</ID>
        <Requirement>
            <ID>id4</ID>
            <Description>value2</Description>
        </Requirement>
        <Requirement>
            <ID>id5</ID>
            <Description>value3</Description>
        </Requirement>
        <Requirement>
            <ID>id6</ID>
            <Description>value4</Description>
        </Requirement>
        <Requirement>
            <ID>id7</ID>
            <Description>value5</Description>
        </Requirement>
        <RequirementGroup>
            <ID>id8</ID>
            <Requirement>
                <ID>id9</ID>
                <Description>value6</Description>
            </Requirement>
            <RequirementGroup pi="attribute">
                <ID>id10</ID>
                <Requirement>
                    <ID>id11</ID>
                    <Description>value7</Description>
                </Requirement>
            </RequirementGroup>
        </RequirementGroup>
    </RequirementGroup>
 </RequirementGroup>
</ParentNode>

这是XSLT:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="2.0" 
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
 xmlns:xs="http://www.w3.org/2001/XMLSchema" 
 xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template name="ExampleTemplate1">
    <ID>Something</ID>
    <Description>example</Description>
    <TypeCode>QUESTION</TypeCode>
    <ValueDataTypeCode>INDICATOR</ValueDataTypeCode>
</xsl:template>
<xsl:template name="ExampleTemplate2">
    <ID>Something</ID>
    <PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
    <xsl:if test="Requirement">
        <xsl:for-each select="Requirement">
            <Example>
                <xsl:call-template name="ExampleTemplate1"/>
            </Example>
        </xsl:for-each>
    </xsl:if>
</xsl:template>
<xsl:template match="ParentNode/RequirementGroup">
    <xsl:if test="RequirementGroup[@pi]">
        <Node1>
            <xsl:call-template name="ExampleTemplate2"/>
            <xsl:if test="RequirementGroup[@pi]">
                <Node1>
                    <xsl:call-template name="ExampleTemplate2"/>
                    <xsl:if test="RequirementGroup[@pi]">
                        <Node1>
                            <xsl:call-template name="ExampleTemplate2"/>
                        </Node1>
                    </xsl:if>
                </Node1>
            </xsl:if>
        </Node1>
    </xsl:if>
</xsl:template>

因此,我想用不同的节点名称以及相同的值来转换XML (但是现在我跳过了值部分,我只想拥有正确的节点结构)。

下面是这个转换的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<Node1>
<ID>Something</ID>
<PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
<Example>
    <ID>Something</ID>
    <Description>example</Description>
    <TypeCode>Something</TypeCode>
    <ValueDataTypeCode>Something</ValueDataTypeCode>
</Example>
<Node1>
    <ID>Something</ID>
    <PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
    <Example>
        <ID>Something</ID>
        <Description>example</Description>
        <TypeCode>Something</TypeCode>
        <ValueDataTypeCode>Something</ValueDataTypeCode>
    </Example>
    <Node1>
        <ID>Something</ID>
        <PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
        <Example>
            <ID>Something</ID>
            <Description>example</Description>
            <TypeCode>Something</TypeCode>
            <ValueDataTypeCode>Something</ValueDataTypeCode>
        </Example>
    </Node1>
  </Node1>
</Node1>

正如您在XML文件中所看到的,对于某些节点,我有多个节点组。这就是为什么,我创建了一个带有循环的模板来获得所有的模板,即使它是一个或五个。但结果不是我想要的结果。

编辑的

期望的产出是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<ParentNode xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Node1>
    <ID>Something</ID>
    <PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
    <Example>
        <ID>Something</ID>
        <Description>example</Description>
        <TypeCode>Something</TypeCode>
        <ValueDataTypeCode>Something</ValueDataTypeCode>
    </Example>
    <Node1>
        <ID>Something</ID>
        <PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
        <Example>
            <ID>Something</ID>
            <Description>example</Description>
            <TypeCode>Something</TypeCode>
            <ValueDataTypeCode>Something</ValueDataTypeCode>
        </Example>
        <Example>
            <ID>Something</ID>
            <Description>example</Description>
            <TypeCode>Something</TypeCode>
            <ValueDataTypeCode>Something</ValueDataTypeCode>
        </Example>
        <Example>
            <ID>Something</ID>
            <Description>example</Description>
            <TypeCode>Something</TypeCode>
            <ValueDataTypeCode>Something</ValueDataTypeCode>
        </Example>
        <Example>
            <ID>Something</ID>
            <Description>example</Description>
            <TypeCode>Something</TypeCode>
            <ValueDataTypeCode>Something</ValueDataTypeCode>
        </Example>
        <Node1>
            <ID>Something</ID>
            <PropertyGroupTypeCode>Something</PropertyGroupTypeCode>
            <Example>
                <ID>Something</ID>
                <Description>example</Description>
                <TypeCode>Something</TypeCode>
                <ValueDataTypeCode>Something</ValueDataTypeCode>
            </Example>
        </Node1>
    </Node1>
  </Node1>
</ParentNode>

我共享的代码已经是可执行的,并且已经简化了.

另外,如果有更好的方法来做这件事,我想听听。因为当我以这种方式进行转换时,我不知道如何替换节点内的值。

EDIT2:

例如,XML1和XML2有不同的名称空间,用来表示它们的SchemaID、版本等等。XML1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<xsl:stylesheet version="2.0"  
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:espd="urn:com:grow:espd:02.00.00" xmlns:cac="urn:X-test:UBL:Pre-
award:CommonAggregate" 
xmlns:ccv="urn:isa:names:specification:ubl:schema:xsd:CCV-
CommonAggregateComponents-1" xmlns:cbc="urn:X-test:UBL:Pre-
award:CommonBasic" xmlns:espd-
req="urn:grow:names:specification:ubl:schema:xsd:ESPDRequest-1" 
xmlns:util="java:java.util.UUID">

XML2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xmlns="urn:X-test:UBL:Pre-award:QualificationApplicationRequest" 
xmlns:cac="urn:X-test:UBL:Pre-award:CommonAggregate" xmlns:cbc="urn:X-
test:UBL:Pre-award:CommonBasic" xmlns:espd="urn:com:grow:espd:02.00.00" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:util="java:java.util.UUID" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

XML1的示例节点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <cbc:ID schemeID="CriteriaID" schemeAgencyID="EU-COM-GROW" schemeVersionID="1.0">

XML2示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<cbc:ID schemeID="CriteriaTaxonomy" schemeAgencyID="EU-COM-GROW" schemeVersionID="02.00.00">

但是,当我将名称空间从XML2复制到我的(您建议的XSLT)文件时(因为以这种方式,我认为它会自动地重新创建新的名称空间,就像在XML2中一样,不会有问题,转换就可以了)。但它有个奇怪的表情,

产出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<cbc:ID xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccv-cbc="urn:isa:names:specification:ubl:schema:xsd:CCV-CommonBasicComponents-1" xmlns:cev="urn:isa:names:specification:ubl:schema:xsd:CEV-CommonAggregateComponents-1" xmlns:cev-cbc="urn:isa:names:specification:ubl:schema:xsd:CEV-CommonBasicComponents-1" xmlns:espd="urn:grow:names:specification:ubl:schema:xsd:ESPDResponse-1" xmlns:espd-cac="urn:grow:names:specification:ubl:schema:xsd:ESPD-CommonAggregateComponents-1" xmlns:espd-cbc="urn:grow:names:specification:ubl:schema:xsd:ESPD-CommonBasicComponents-1" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" schemeID="CriteriaID" schemeAgencyID="EU-COM-GROW" schemeVersionID="1.0">

在输出中,它添加节点旁边的所有命名空间。为什么?如何将所需的名称空间、版本等从一个转换到另一个?就像在XML2中一样,改变节点的姿态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-25 01:23:48

我不能完全理解你想要什么,但从我目前掌握的情况来看,你需要一个身份模板,即

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

以及匹配RequirementGroupRequirement节点的模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<xsl:template match="RequirementGroup">
    <Node1>
        <xsl:apply-templates/>
    </Node1>
</xsl:template>

<xsl:template match="Requirement">
    <Example>
        <xsl:apply-templates/>
    </Example>
</xsl:template>

xsl:apply-templates本身是递归的。整个样式表如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="RequirementGroup">
        <Node1>
            <xsl:apply-templates/>
        </Node1>
    </xsl:template>

    <xsl:template match="Requirement">
        <Example>
            <xsl:apply-templates/>
        </Example>
    </xsl:template>

   <xsl:template match="ParentNode">
       <ParentNode>
           <xsl:apply-templates/>
       </ParentNode>
   </xsl:template>

</xsl:stylesheet>

只需向其添加其他模板以更改值即可。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48428478

复制
相关文章
XML中节点类型
该 Node 接口是整个文档对象模型的主要数据类型。它表示该文档树中的单个节点。当实现 Node 接口的所有对象公开处理子节点的方法时,不是实现 Node 接口的所有对象都有子节点。例如,Text 节点可能没有子节点,且将子节点添加到这样的节点将导致引发 DOMException。
sr
2018/08/20
1.2K0
XML中节点类型
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
创建 XmlParser 解析器 , 传入 Xml 文件对应的 File 对象 ;
韩曙亮
2023/03/30
7.2K0
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 删除 Xml 文件中的节点 | 增加 Xml 文件中的节点 | 将修改后的 Xml 数据输出到文件中 )
在 【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 ) 博客基础上 , 删除 Xml 文件中的节点信息 ;
韩曙亮
2023/03/30
6.2K0
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 删除 Xml 文件中的节点 | 增加 Xml 文件中的节点 | 将修改后的 Xml 数据输出到文件中 )
修改xml的节点
交流、咨询,有疑问欢迎添加QQ 2125364717,一起交流、一起发现问题、一起进步啊,哈哈哈哈哈 import osimport xml.etree.ElementTree as ET#程序功能:批量修改VOC数据集中xml标签文件的标签名称def changelabelname(inputpath): listdir = os.listdir(inputpath) for file in listdir: if file.endswith('xml'):
狼啸风云
2021/06/10
9190
Newtonsoft中Json和Xml的转换
var user = new Dictionary<string, object> { {"CompanyName","Epoint" }, {"UserName","Ellis" }, {"Address",new Dictionary<string,string> { {"Country","China"},
happlyfox
2019/08/05
2.2K0
Java xml 添加节点
大家好,又见面了,我是你们的朋友全栈君。 建立一个xml文件test.xml,文件内容如下 <?xml version=”1.0″ encoding=”GB2312″ standalone=”no
全栈程序员站长
2022/09/16
1.7K0
单层XML结构转换为对象数组 - Jackson
上面的XML中,有两个子结构(name, content, hours),因为是单层结构所以都以序号结尾。 这种格式的XML,没办法定义一个完整的对象,再使用Jackson来直接转换。
十毛
2019/12/16
2.7K0
XML转换_xml文件转化为excel格式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/171935.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
8860
XML转换_xml文件转化为excel格式
java:利用xpath删除xml中的空节点
原始xml内容: 1 <data> 2 <a> </a> 3 <b>b1</b> 4 <awb> 5 <awbpre>123</awbpre> 6 <awbno></awbno> 7 </awb> 8 <spls> 9 <spl /> 10 </spls> 11 </data> 可用下面的代码去掉 <awbno></awbno>、<spls><spl/></spls>这二个空节点 (注<a> </a>中间有一个空格,不算空节点) 1
菩提树下的杨过
2018/01/24
2.4K0
python增加xml文件节点
<train name="wang"> <id>1</id> </train></Manager>'''
py3study
2020/01/10
2.8K0
XML获取当前节点信息
%XML.Node的以下字符串属性。提供关于当前节点的信息。 在所有情况下,如果没有当前节点,将抛出一个错误。
用户7741497
2022/07/05
1.6K0
XML--XML从入门到精通 Part 1 认识XML
可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
风骨散人Chiam
2020/10/28
8280
Java xml节点属性的修改[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 Java xml节点属性的修改 修改xml节点的属性,我们先建立一个修改之前的xml文档: <?xml version=”1.0″ encoding=”GB2
全栈程序员站长
2022/09/13
2K0
[golang]golang解析xml到结构体的时候无法解析
这是一个很简单的问题,但是,简单的问题,如果由于格式不准确,那么就会变成很复杂的问题。
用户2353021
2020/05/12
2.3K0
xml转为excel_excel表格怎么转换xml格式
旧版的 excel 文件 Office XML是xml类型的,也称为SpreadsheetML类型,很古老的excel类型了是2002年左右的格式,现在的格式都是用的 xls 或者 xlsx。遇到的问题就是要把xml类型的 Office XML转化为 xlsx的excel,所以写了本篇文章方便以后遇到这个问题的人。
全栈程序员站长
2022/09/23
3.2K0
xml转为excel_excel表格怎么转换xml格式
操作引入xml文件的书包(定位到指定节点)「建议收藏」
上述表达式表示定位到_samples/test.xml书包的e0.1节点,接下来的操作都对当前节点进行的,当中HtokID=节点号是一个固定使用方法。
全栈程序员站长
2022/07/08
4350
操作引入xml文件的书包(定位到指定节点)「建议收藏」
将XML导入到对象中
注意:使用的任何XML文档的XML声明都应该指明该文档的字符编码,并且文档应该按照声明的方式进行编码。如果未声明字符编码, IRIS将使用前面的“输入和输出的字符编码”中描述的默认值。如果这些默认值不正确,请修改XML声明,使其指定实际使用的字符集。
用户7741497
2022/07/04
1.6K0
使用%XML.TextReader 节点属性
如前所述,类中的%XML.TextReader解析XML文档并创建一个text reader对象,该对象由一组与文档组件相对应的节点组成;节点类型在本章前面的“文档节点”中进行了描述。
用户7741497
2022/07/05
1K0
【Groovy】自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称、节点值、节点属性、子节点 | 将封装的节点数据转为 Xml 字符串 )
生成 Xml 数据前 , 首先要将 Xml 数据封装起来 , 先手机 Xml 的各个层级节点的信息 , 最后利用这些节点信息生成 Xml 数据 ;
韩曙亮
2023/03/30
6.2K0
Python中XML数据结构详细解析
物联网应用过程中,设备采集数据后,一般通过终端采集器网关转发或web server服务打包成xml或json数据格式传输到数据中心或云平台,最后经数据解析、数据分析及数据可视化。开发环节涉及末端设备数据采集、数据转发、数据解析等流程。
用户8949263
2022/04/08
2.2K0
Python中XML数据结构详细解析

相似问题

如何在XSLT2.0中转换内部节点结构

10

xml节点层次结构转换

20

XML节点内部的XML

22

使用XSLT2.0的xml转换

12

XML到XML转换:嵌套相似的节点

25
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文