2014-07-21 36 views
0

這是一個問題,我意識到已經有很多不同的方法被問及許多不同的解決方案,但是儘可能地嘗試,我找不到解決方案會給我想要的效果。我正在創建xsl fo模板,以便爲Apache FOP提供PDF。我正在渲染的PDF非常直觀,它只是一個包含重複行的表格,我想根據基於整數值對所選重複節點的子標記進行排序來控制行渲染的順序。使用XSLT V 1.0對PDF輸出中的數據進行排序使用XSLT V 1.0

我的XML看起來像這樣...

<?xml version="1.0" encoding="UTF-8"?> 
    <Stops> 
    <Stop> 
     <Sequence>1</Sequence> 
     <Address> 
     <Street>123 main st</Street> 
     <City>Toronto</City> 
     <Postal_Code>L1G4F4</Postal_Code> 
     </Address> 
    </Stop> 
    <Stop> 
     <Sequence>3</Sequence> 
     <Address> 
     <Street>1441 First st</Street> 
     <City>Toronto</City> 
     <Postal_Code>L1G4F4</Postal_Code> 
     </Address> 
    </Stop> 
    <Stop> 
     <Sequence>2</Sequence> 
     <Address> 
     <Street>467 Center st</Street> 
     <City>Vancouver</City> 
     <Postal_Code>L9V4A1</Postal_Code> 
     </Address> 
    </Stop> 
    </Stops> 

我XSLFO代碼看起來像......

<fo:table> 
<fo:table-column column-width="proportional-column-width(50)" column-number="1"/> 
<fo:table-column column-width="proportional-column-width(50)" column-number="2"/> 
<fo:table-body> 
    <xsl:call-template name="sort-stops"/> 
    </fo:table-body> 
</fo:table> 

與...

<xslt:template select="Stops" name="sort-stops"> 
<xsl:sort slect="stop/sequence"/> 
<xsl:for-each select="stop"> 
    <fo:table-row> 
    <fo:table-cell> 
    <fo:block> 
    <xsl:value-of select="sequence"/> 
    </fo:block> 
    </fo:table-cell> 
    </fo:table-row> 
</xsl:for-each> 
</xslt:template> 

顯然有什麼不對用我的方法來解決這個問題,但我不知道該從哪裏出發。如果我堅持使用簡單的代碼在我的排序停止模板定義中插入塊,那麼會顯示出來,但看起來問題似乎在於如何訪問停止元素的子節點。任何人都可以請給我一些方向,以瞭解如何根據序列標籤對錶格行進行排序,並按此順序重複排序?

+0

'xsl:sort'元素必須是'xsl:apply-templates'或'xsl:for-each'的子元素。 –

+0

對不起,我意識到我忘記爲模板輸入select語句,select語句是否允許您像在for-each語句中那樣引用子元素? – adam5990

+0

有沒有這樣的事情作爲「選擇陳述」; 'select'是幾個xsl元素的**屬性**。如果你問'xsl:sort'是否可以是'xsl:template'的子項,那麼答案是否定的。 –

回答

2

你不發表您所需的輸出,但我猜你想要做這樣的事情:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/"> 
    <fo:table> 
     <fo:table-column column-width="proportional-column-width(50)" column-number="1"/> 
     <fo:table-column column-width="proportional-column-width(50)" column-number="2"/> 
     <fo:table-body> 
      <xsl:apply-templates select="Stops/Stop"> 
       <xsl:sort select="Sequence" data-type="number" order="ascending"/> 
      </xsl:apply-templates> 
     </fo:table-body> 
    </fo:table> 
</xsl:template> 

<xsl:template match="Stop"> 
    <fo:table-row> 
     <fo:table-cell> 
      <fo:block> 
       <xsl:value-of select="Sequence"/> 
      </fo:block> 
     </fo:table-cell> 
    </fo:table-row> 
</xsl:template> 

</xsl:stylesheet> 

這給你的榜樣輸入時產生:

<?xml version="1.0" encoding="UTF-8"?> 
<fo:table xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:table-column column-width="proportional-column-width(50)" column-number="1"/> 
    <fo:table-column column-width="proportional-column-width(50)" column-number="2"/> 
    <fo:table-body> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block>1</fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block>2</fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
     <fo:table-cell> 
      <fo:block>3</fo:block> 
     </fo:table-cell> 
     </fo:table-row> 
    </fo:table-body> 
</fo:table> 

請注意,XML區分大小寫; select="sequence"確實不是選擇<Sequence>

+0

注意:如果這是更大的解決方案的一部分,那麼在渲染表之前,應該測試計數(停止/停止)大於「0」。即xsl:if test =「count(停止/停止)> 0」。否則,你最終會得到一個空的表體,這不是合法的XSL FO構造。 –

+0

謝謝你,這個解決方案完美的工作,我真的很感謝你的答案的細節和清晰度。 – adam5990