xslt可展平任何xml文件
以以下XML为例:xslt可展平任何xml文件,xml,xslt,transform,Xml,Xslt,Transform,以以下XML为例: <?xml version="1.0" encoding="UTF-8"?> <Message> <MessageID>1</MessageID> <MessageType>0</MessageType> <UniqueRef>12</UniqueRef> <CreatedBy>fooo.bar</CreatedBy> <Product>
<?xml version="1.0" encoding="UTF-8"?>
<Message>
<MessageID>1</MessageID>
<MessageType>0</MessageType>
<UniqueRef>12</UniqueRef>
<CreatedBy>fooo.bar</CreatedBy>
<Product>
<Name>Food Mixer</Name>
<Origin>London</Origin>
<CreatedBy>foo.bar</CreatedBy>
</Product>
<ProductExtendedProperties>
<CreateDate>23/10/2010</CreateDate>
<CreatedBy>foo.bar</CreatedBy>
</ProductExtendedProperties>
<Items>
<Item>
<Title>Food Mixer</Title>
<CreatedBy>my.customer</CreatedBy>
</Item>
</Items>
1.
0
12
富奥酒吧
食品搅拌机
伦敦
美食酒吧
23/10/2010
美食酒吧
食品搅拌机
我的顾客
是否有可能创建一个xslt,它是通用的,因为它将接受抛出的任何元素,不管是否嵌套,并提供格式良好的html
大概是这样的:
<html>
<body>
<fieldset>
<legend>Message</legend>
<div>
<p>MessageID: 1</p>
<p>MessageType: 0</p>
<p>UniqueRef: 0</p>
<p>CreatedBy: foo.bar</p>
<div>
<p>Product:</p>
<ul>
<li>Name: Food Mixer</li>
<li>Origin: London</li>
<li>CreatedBy: foo.bar</li>
</ul>
</div>
<div>
<p>ProductExtendedProperties:</p>
<ul>
<li>CreateDate: 23/10/2010</li>
<li>CreatedBy: foo.bar</li>
</ul>
</div>
<div>
<p>
Items
</p>
<div>
<p>Item 1:</p>
<ul>
<li>Title: Food Mixer</li>
<li>CreatedBy: my.customer</li>
</ul>
</div>
</div>
</div>
</fieldset>
</body>
消息
MessageID:1
消息类型:0
UniqueRef:0
CreatedBy:foo.bar
产品:
- 名称:食品搅拌机
- 产地:伦敦
- CreatedBy:foo.bar
ProductExtendedProperties:
- 创建日期:23/10/2010
- CreatedBy:foo.bar
项目
项目1:
- 标题:食物搅拌机
- CreatedBy:my.customer
它不必如此复杂,只需将元素的所有名称和值格式化为嵌套列表元素即可
我不知道从哪里开始使用xslt
非常感谢任何帮助我认为,如果你开始尝试解决你需要的问题,然后具体说明你需要从哪里获得帮助,人们会更能帮助你 例如,您可以从一个将模板应用于
“*”
(任何子元素)的模板开始,另一个模板与“*”
匹配,并使用local-name()
输出当前元素的名称(以及所需的标记)。单向:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml"/>
<xsl:template match="/*" priority="1">
<html>
<body>
<fieldset>
<legend>
<xsl:value-of select="name()"/>
</legend>
<div>
<xsl:apply-templates/>
</div>
</fieldset>
</body>
</html>
</xsl:template>
<xsl:template match="/*/*[not(*)]" priority="1">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="*[*]">
<div>
<p>
<xsl:value-of select="concat(name(),':')"/>
</p>
<xsl:apply-templates/>
</div>
</xsl:template>
<xsl:template match="*[not(*)][position()!=1]"/>
<xsl:template match="*[not(*)][1]">
<ul>
<xsl:apply-templates select="../*" mode="makeLi"/>
</ul>
</xsl:template>
<xsl:template match="*" mode="makeLi">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="concat(name(..),': ',.)"/>
</xsl:template>
</xsl:stylesheet>
输出:
<html>
<body>
<fieldset>
<legend>Message</legend>
<div>
<p>MessageID: 1</p>
<p>MessageType: 0</p>
<p>UniqueRef: 12</p>
<p>CreatedBy: fooo.bar</p>
<div>
<p>Product:</p>
<ul>
<li>Name: Food Mixer</li>
<li>Origin: London</li>
<li>CreatedBy: foo.bar</li>
</ul>
</div>
<div>
<p>ProductExtendedProperties:</p>
<ul>
<li>CreateDate: 23/10/2010</li>
<li>CreatedBy: foo.bar</li>
</ul>
</div>
<div>
<p>Items:</p>
<div>
<p>Item:</p>
<ul>
<li>Title: Food Mixer</li>
<li>CreatedBy: my.customer</li>
</ul>
</div>
</div>
</div>
</fieldset>
</body>
</html>
消息
MessageID:1
消息类型:0
UniqueRef:12
CreatedBy:fooo.bar
产品:
- 名称:食品搅拌机
- 产地:伦敦
- CreatedBy:foo.bar
ProductExtendedProperties:
- 创建日期:23/10/2010
- CreatedBy:foo.bar
项目:
项目:
- 标题:食物搅拌机
- CreatedBy:my.customer
听起来像是一个评论,而不是一个答案。@ceving:这是一个评论。但是OP说“我不知道从哪里开始使用xslt……非常感谢任何帮助”。我建议了一个起点(以及在这个问题上取得进展的方法)。当时,OP没有答案。我认为这是一个合格的答案。