2015-08-23 12 views
2

мой источник XML выглядит следующим образом:Список XSLT FO элементы

<events> 
    <entry> 
     <event>Event 1</event> 
     <event>Event 2</event> 
     <event>Event 3</event> 
     <event>Event 4</event> 
    </entry> 
</events> 

Вот соответствующий код моего XSL преобразования:

<fo:block-container> 
    <fo:list-block> 
    <xsl:for-each select="//event"> 
     <fo:list-item> 
     <fo:list-item-label/> 
      <fo:list-item-body> 
       <fo:block> 
       <xsl:value-of select="//event"/> 
       </fo:block> 
      </fo:list-item-body> 
     </fo:list-item> 
    </xsl:for-each> 
    </fo:list-block> 
</fo:block-container> 

И выход FO:

<fo:list-block> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 1Event 2Event 3Event 4</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 1Event 2Event 3Event 4</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 1Event 2Event 3Event 4</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 1Event 2Event 3Event 4</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 

Мои проблема в том, что каждый из элементов события должен быть преобразован в отдельный fo: list-item, например:

<fo:list-block> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 1</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 2</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 3</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 
    <fo:list-item> 
    <fo:list-item-label/> 
     <fo:list-item-body> 
     <fo:block>Event 4</fo:block> 
     </fo:list-item-body> 
    </fo:list-item> 

Я надеюсь, что вы можете помочь мне ...

ответ

4

Вместо

<xsl:value-of select="//event"/> 

использование

<xsl:value-of select="."/> 

Вы хотите вывести событие ток, в конце концов, не все из них.


В более общем плане, я рекомендую изменить свой XSLT программу подальше от <xsl:for-each> в сторону формы <xsl:template>/<xsl:apply-templates> основе:

<xsl:template match="events"> 
    <fo:block-container> 
    <xsl:apply-templates /> 
    </fo:block-container> 
</xsl:template> 

<xsl:template match="events/entry"> 
    <fo:list-block> 
    <xsl:apply-templates /> 
    <fo:list-block> 
</xsl:template> 

<xsl:template match="events/entry/event"> 
    <fo:list-item> 
    <fo:list-item-label/> 
    <fo:list-item-body> 
     <fo:block> 
     <xsl:value-of select="."/> 
     </fo:block> 
    </fo:list-item-body> 
    </fo:list-item> 
</xsl:template> 

Этот подход является более модульным, имеет лучшую возможность повторного использования и в целом не так глубоко вложен.

1

Замените <xsl:value-of select="//event"/> на <xsl:value-of select="."/> как внутри for-each Элемент event является узлом контекста.

Смежные вопросы