使用xslt编码层次结构问题xslt v1将xml转换为xml
在我的输入 xml 文件中,我在元素属性“lp”中获得了编码层次结构:
<element lp="1"/>
<element lp="1.1"/>
<element lp="2"/>
<element lp="3"/>
<element lp="3.1" />
<element lp="3.2" />
<element lp="3.2.1" />
如何将此 xml 数据转换为
<element lp="1">
<element lp="1.1"/>
</element>
<element lp="2"/>
<element lp="3">
<element lp="3.1"/>
<element lp="3.2">
<element lp="3.2.1">
</element>
</element>
In my input xml file I have got encoded hierarchy in elements attribute "lp":
<element lp="1"/>
<element lp="1.1"/>
<element lp="2"/>
<element lp="3"/>
<element lp="3.1" />
<element lp="3.2" />
<element lp="3.2.1" />
How to transform this xml data to
<element lp="1">
<element lp="1.1"/>
</element>
<element lp="2"/>
<element lp="3">
<element lp="3.1"/>
<element lp="3.2">
<element lp="3.2.1">
</element>
</element>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 XSLT2.0 可能有一种简单的方法可以做到这一点,但我在这里假设是 XSLT1.0。
需要注意的一件事是,您的 XML 并不严格有效,因为它缺少根元素。出于答案的目的,我假设根元素称为 elements
为了实现这一点,我认为您需要一个函数来确定元素的“级别”。这可以通过计算 @lp 属性中句号的数量来完成。在 XSLT1.0 中,我通过从文本中删除所有句号并将生成的字符串长度与原始字符串长度进行比较来完成此操作
因此,为了匹配顶级元素,您将执行此操作...
这将匹配以下元素
Next ,对于每个匹配的元素,都是匹配后面元素的情况,其中
这可以通过下面的 select 来完成
(注意 $len 和 $level是包含当前 @lp 属性的长度和当前级别的变量)
将其放在一起给出以下 XSLT....
当应用于以下 XML 时
产生以下输出
There is probably a simply way to do this with XSLT2.0, but I have assumed XSLT1.0 here.
One thing to not is that your XML is not strictly valid, because it lacks a root element. For the purposes of the answer, I have assumed the root element is called elements
To achieve this, I think you need a function to determine the 'level' of an element. This can be done by counting the number of full stops in the @lp attribute. In XSLT1.0 I have done this by removing all full-stops from the text, and comparing the resultant string length with the original string length
Thus to match the top level elements you would do this...
This would match the folllowing elements
Next, for each matched element, it is a case of matching following elements where
This can be done with the following select
(Note $len and $level are variables containing the length of the current @lp attribute and the current level)
Putting this altogether gives the following XSLT....
When applied to the following XML
Produces the following output
我认为这是之前的答案......这个样式表:
输出:
I think this was answer before... This stylesheet:
Output: