基于属性的 Unpivot xml 文档
我有一个简单的 xml 文档,如下所示。 我需要编写一个 XSLT 转换,基本上根据某些属性“反转”此文档。
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:z="foo">
<z:row A="1" X="2" Y="n1" Z="500"/>
<z:row A="2" X="5" Y="n2" Z="1500"/>
</root>
这就是我期望的输出 -
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:z="foo">
<z:row A="1" X="2" />
<z:row A="1" Y="n1" />
<z:row A="1" Z="500"/>
<z:row A="2" X="5" />
<z:row A="2" Y="n2"/>
<z:row A="2" Z="1500"/>
</root>
感谢您的帮助。
I have a simple xml document that looks like the following snippet. I need to write a XSLT transform that basically 'unpivots' this document based on some of the attributes.
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:z="foo">
<z:row A="1" X="2" Y="n1" Z="500"/>
<z:row A="2" X="5" Y="n2" Z="1500"/>
</root>
This is what I expect the output to be -
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:z="foo">
<z:row A="1" X="2" />
<z:row A="1" Y="n1" />
<z:row A="1" Z="500"/>
<z:row A="2" X="5" />
<z:row A="2" Y="n2"/>
<z:row A="2" Z="1500"/>
</root>
Appreciate your help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是一种比较暴力的方法:
Here is a bit of a brute force way:
加上明显的样板。
Plus obvious boilerplate.
这更复杂,但也更通用:
This is more complex but also more generic:
这是您需要的完整样式表(因为命名空间很重要):
我更喜欢使用文字结果元素(例如
和属性值模板(属性值中的
)而不是{}
),因为这样可以使代码更短并且更容易查看您生成的结果文档的结构。 其他人更喜欢
和
因为这样一切都是 XSLT 指令。如果您使用的是 XSLT 2.0,有一些语法细节会有所帮助,即 XPath 中的
except
运算符以及直接在上使用
:select
属性的能力>Here's the full stylesheet you need (since the namespaces are important):
I much prefer using literal result elements (eg
<z:row>
) rather than<xsl:element>
and attribute value templates (those{}
s in attribute values) rather than<xsl:attribute>
where possible as it makes the code shorter and makes it easier to see the structure of the result document that you're generating. Others prefer<xsl:element>
and<xsl:attribute>
because then everything is an XSLT instruction.If you're using XSLT 2.0, there are a couple of syntactic niceties that help, namely the
except
operator in XPath and the ability to use aselect
attribute directly on<xsl:attribute>
: