XSLT:根据当前返回下一个节点



我觉得我错过了一些简单的东西和/或想太多了。我在这里和网上其他地方找到的答案已经让我接近了,但有些不同的东西一直让我困惑。我只能使用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>

相关内容

  • 没有找到相关文章

最新更新