2013-11-01 21 views
1

可以說我有下面的XML文件內容:XSLT位置() - exlude失敗的測試條件

<jobs> 
    <job> 
    <PositionTitle>Painter</PositionTitle> 
    <InternalOrExternal>External</InternalOrExternal> 
    </job> 
    <job> 
    <PositionTitle>Plumber</PositionTitle> 
    <InternalOrExternal>Internal</InternalOrExternal> 
    </job> 
    <job> 
    <PositionTitle>Chemist</PositionTitle> 
    <InternalOrExternal>Internal</InternalOrExternal> 
    </job> 
    <job> 
    <PositionTitle>Teacher</PositionTitle> 
    <InternalOrExternal>External</InternalOrExternal> 
    </job> 
</jobs> 

我處理它與下面的XSLT只顯示外部工作:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:content="http://purl.org/rss/1.0/modules/content/" > 
    <xsl:output method="html"/> 
    <xsl:template match="/"> 

     <xsl:for-each select="jobs/job"> 

      <xsl:if test="InternalOrExternal = 'External'"><!-- Only show external jobs --> 
       <xsl:value-of select="PositionTitle"/> - <xsl:value-of select="position()"/><br /> 
      </xsl:if> 

     </xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 

這個結果:

Painter - 1 
Teacher - 4 

我假設的位置()函數返回的XML的實際位置文件並且不考慮可能排除某些作業的任何if語句。在這種情況下,內部工作被排除在外,但他們的職位仍被計算在內。

結果,我想要的是:

Painter - 1 
Teacher - 2 

是他們的任何方法可以讓我得到這個職位()函數只算什麼,我展示?

我已經試過這沒有運氣:

<xsl:value-of select="position(jobs/job[InternalOrExternal='External'])"/> 

回答

4

position()讓你通過最近的for-eachapply-templates選擇什麼節點列表當前節點的"current node list"內的位置,即。您可以非正式地將此視爲for-each 的當前迭代編號。說

<xsl:for-each select="jobs/job"> 

當前節點列表是所有作業元素,所以你得到的第四個第一個和第4位的位置1。如果刪除xsl:if,而是移動到過濾謂詞的for-each選擇:

<xsl:for-each select="jobs/job[InternalOrExternal='External']"> 
    <xsl:value-of select="PositionTitle"/> - <xsl:value-of select="position()"/><br /> 
</xsl:for-each> 

那麼當前節點列表中只包括「外部」 job元素,你會得到你所需要的position()值。


由於XSLT指令不具有副作用(例如不存在更新的變量),XSLT處理器不一定必須在內部使用順序循環來實現for-each。它可以選擇並行或不按順序處理不同的節點,只要它將輸出組裝爲看起來與順序循環相同的輸出即可。

+0

感謝伊恩,可以完美運行:) – Scott

0

除了伊恩羅伯茨的很好的回答:如果你必須有上下文job(無論什麼原因),你也可以使用xsl:number而不是position()

例子:

<xsl:value-of select="PositionTitle"/> - <xsl:number count="job[InternalOrExternal='External']"/><br />