我觉得我错过了一些简单的东西和/或想太多了。我在这里和网上其他地方找到的答案已经让我接近了,但有些不同的东西一直让我困惑。我只能使用XSL 1.0。
XML><?xml version="1.0" encoding="UTF-8" ?>
<Items>
<Data>
<Class>
<List>
<Elements>
<Property>1</Property>
<Property>Date</Property>
<Property>08/10/10</Property>
</Elements>
<Elements>
<Property>2</Property>
<Property>Time</Property>
<Property>21:09:11</Property>
</Elements>
<Elements>
<Property>3</Property>
<Property>User</Property>
<Property>Mario</Property>
</Elements>
</List>
</Class>
<Class>
<List>
<Elements>
<Property>1</Property>
<Property>Date</Property>
<Property>10/12/14</Property>
</Elements>
<Elements>
<Property>2</Property>
<Property>Time</Property>
<Property>08:10:00</Property>
</Elements>
<Elements>
<Property>3</Property>
<Property>User</Property>
<Property>Luigi</Property>
</Elements>
</List>
</Class>
</Data>
</Items>
XSLT <?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output version='1.0' encoding='UTF-8' indent='no' method='xml' />
<xsl:template match='/'>
<xsl:for-each select="Items/Data/Class">
<TR>
<xsl:for-each select="List/Elements">
<TD><xsl:value-of select="Property['Date']/following-sibling::Property[1]" /></TD>
<TD><xsl:value-of select="Property['Time']/following-sibling::Property[1]" /></TD>
<TD><xsl:value-of select="Property['User']/following-sibling::Property[1]" /></TD>
</xsl:for-each>
</TR>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
期望输出值
<TR>
<TD>08/10/10</TD>
<TD>21:09:11</TD>
<TD>Mario</TD>
</TR>
<TR>
<TD>10/12/14</TD>
<TD>08:10:00</TD>
<TD>Luigi</TD>
</TR>
基本上,通过Property的…如果是Date,那么返回下一个…如果是Time,那么返回下一个…如果是User,那么返回下一个。继续浏览所有类
我的选择不太正确,我无法越过第一个元素。我是否需要另一个for-each或choose/when语句?
谢谢你的帮助。
我建议你这样试试:
<xsl:template match='/'>
<xsl:for-each select="Items/Data/Class">
<TR>
<TD>
<xsl:value-of select="List/Elements[Property='Date']/Property[3]" />
</TD>
<TD>
<xsl:value-of select="List/Elements[Property='Time']/Property[3]" />
</TD>
<TD>
<xsl:value-of select="List/Elements[Property='User']/Property[3]" />
</TD>
</TR>
</xsl:for-each>
</xsl:template>
或者只是:
<xsl:template match='/'>
<xsl:for-each select="Items/Data/Class">
<TR>
<xsl:for-each select="List/Elements">
<TD>
<xsl:value-of select="Property[3]" />
</TD>
</xsl:for-each>
</TR>
</xsl:for-each>
</xsl:template>
注意,结果不是一个格式良好的XML文档(没有单个根元素)。
下面是一个推式(模板匹配而不是拉式[for-each])方法。说明包括:
<?xml version='1.0' encoding='UTF-8' ?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:strip-space elements="*"/>
<xsl:output version='1.0' encoding='UTF-8' indent='yes' method='xml' />
<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- set Class tags -->
<xsl:template match="Class">
<TR>
<!-- apply Elements node -->
<xsl:apply-templates select="List/Elements"/>
</TR>
</xsl:template>
<xsl:template match="Elements">
<TD>
<!-- get the target node -->
<xsl:value-of select="Property[3]"/>
</TD>
</xsl:template>
<!-- set table headers -->
<xsl:template match="Items">
<TABLE>
<TR>
<TD>Date</TD>
<TD>Time</TD>
<TD>User</TD>
</TR>
<xsl:apply-templates/>
</TABLE>
</xsl:template>
<!-- delete unwanted tags -->
<xsl:template match="Data">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>