2016-08-15 77 views
1

我覺得我錯過了一些簡單和/或過度的東西。我在這裏和網絡上的其他地方找到的答案已經讓我接近,但有些不同,讓我絆倒了我。我堅持使用XSL 1.0。XSLT:根據當前狀態返回下一個節點

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> 

基本上,經過PROPERT如果是Date,則返回下一個...如果是Time,則返回下一個...並且如果它是User,則返回下一個。繼續瀏覽所有課程。

我的選擇不太對,我無法通過第一個元素。我需要另一個for-each或選擇/ when語句嗎?

感謝您的幫助。

回答

0

我建議你試試這樣說:

<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文檔(沒有單根元素)。

+0

啊,謝謝。你的第一個解決方案有效我忽略了在我的例子中指定,但確實有其他的元素,我不想包括在內,所以匹配對於這些標準很重要。 –

0

下面是一個push-type(模板匹配,而不是拉式[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> 
相關問題