我有一个要求,我需要从XML文档生成一个文本文件,生成的文本文件应该是基于某些规则的某种特定格式.我的XML看起来如下所示:
<info>
<Tag1>
<Tag2>
<Tag3>
<PartNo>12 </PartNo>
</Tag3>
<DBOMInf1> 111 </DBOMInf1>
<DBOMInf2> sring </DBOMInf2>
</Tag2>
<Tag2>
<Tag3>
<PartNo>12 </PartNo>
</Tag3>
<DBOMInf1> 555 </DBOMInf1>
<DBOMInf2> abcd </DBOMInf2>
</Tag2>
</Tag1>
<Tag4>
<Tag5>
<Description>1200 liter </Description>
<No>12</No>
<Name>Engine</Name>
<Id>700</Id>
</Tag5>
</Tag4>
<action>
<actionId>700</actionId>
</action>
</info>
Run Code Online (Sandbox Code Playgroud)
ACTIONID | NO | DESCRIPTION | NAME | DBOMInf1 | DBOMInf2 700 | 12 |发动机| 1200升| 111 | sring 700 | 12 |发动机| 1200升| 555 | ABCD
我是新手XSLT编程可以任何机构共享一些信息或示例如何实现这一点,我熟悉XSLT的基础,如模板匹配,选择值.
任何链接或示例都将非常有用.谢谢
看起来你想为每个Tag2元素添加一行,在这种情况下,通过执行以下操作可以轻松匹配(假设您当前位于info元素上)
<xsl:apply-templates select="Tag1/Tag2" />
Run Code Online (Sandbox Code Playgroud)
但是看起来你也希望从Tag5元素中查找信息.在这种情况下,您可以使用键来查找基于No元素的值.关键将定义如下:
<xsl:key name="Tags" match="Tag5" use="No" />
Run Code Online (Sandbox Code Playgroud)
要查找给定Tag2元素的标记,您可以执行以下操作:
<xsl:apply-templates select="key('Tags', normalize-space(Tag3/PartNo))" />
Run Code Online (Sandbox Code Playgroud)
(注意,规范化空间,从元素中删除多余的空白)
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:key name="Tags" match="Tag5" use="No" />
<xsl:template match="/info">
<xsl:text>ACTIONID|NO|DESCRIPTION|NAME|DBOMInf1|DBOMInf2</xsl:text>
<xsl:value-of select="' '" />
<xsl:apply-templates select="Tag1/Tag2" />
</xsl:template>
<xsl:template match="Tag2">
<xsl:apply-templates select="key('Tags', normalize-space(Tag3/PartNo))" />
<xsl:value-of select="concat(DBOMInf1, '|', DBOMInf2, ' ')" />
</xsl:template>
<xsl:template match="Tag5">
<xsl:value-of select="concat(Id, '|', No, '|', Name, '|', Description, '|')" />
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
应用于输入XML时,将输出以下文本
ACTIONID|NO|DESCRIPTION|NAME|DBOMInf1|DBOMInf2
700|12|Engine|1200 liter | 111 | sring
700|12|Engine|1200 liter | 555 | abcd
Run Code Online (Sandbox Code Playgroud)