我有一个XML文档,其结构如下:
E.g:
<DataModel>
<String name="a">aaa</String>
<Integer name="b">bbb</Integer>
<Node name="n1">
<String name="k">kkk</String>
<Integer name="l">lll</Integer>
<Node name="n2">
<String name="x">xxx</String>
</Node>
</Node>
</DataModel>
我想处理这个XML,扁平化输出,但在命名中引入层次结构,如下所示:
<table>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
<tr>
<td>a</td>
<td>aaa</td>
</tr>
<tr>
<td>b</td>
<td>bbb</td>
</tr>
<tr>
<td>n1.k</td>
<td>kkk</td>
</tr>
<tr>
<td>n1.l</td>
<td>lll</td>
</tr>
<tr>
<td>n1.n2.x</td>
<td>xxx</td>
</tr>
</table>
任何想法如何做到这一点?
答案 0 :(得分:0)
使用此模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="DataModel">
<table>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
<xsl:apply-templates select="*"/>
</table>
</xsl:template>
<xsl:template match="*">
<tr>
<td>
<xsl:for-each select="ancestor::Node">
<xsl:value-of select="concat(@name, '.')"/>
</xsl:for-each>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="."/>
</td>
</tr>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="Node">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
应用于XML:
<DataModel>
<String name="a">aaa</String>
<Integer name="b">bbb</Integer>
<Node name="n1">
<String name="k">kkk</String>
<Integer name="l">lll</Integer>
<Node name="n2">
<String name="x">xxx</String>
</Node>
</Node>
</DataModel>
将产生所需的输出:
<table>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
<tr>
<td>a</td>
<td>aaa</td>
</tr>
<tr>
<td>b</td>
<td>bbb</td>
</tr>
<tr>
<td>n1.k</td>
<td>kkk</td>
</tr>
<tr>
<td>n1.l</td>
<td>lll</td>
</tr>
<tr>
<td>n1.n2.x</td>
<td>xxx</td>
</tr>
</table>
答案 1 :(得分:0)
此模板支持任何深度的嵌套,感谢 for-each 祖先:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="DataModel">
<table>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
<xsl:apply-templates select="*"/>
</table>
</xsl:template>
<xsl:template match="Node">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="String|Integer">
<tr>
<td>
<xsl:for-each select="ancestor::Node">
<xsl:value-of select="concat(@name, '.')"/>
</xsl:for-each>
<xsl:value-of select="@name"/>
</td>
<td>
<xsl:value-of select="."/>
</td>
</tr>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
所以结果完全符合要求,包括最后一行:
...
<tr>
<td>n1.n2.x</td>
<td>xxx</td>
</tr>
</table>