2015-06-17 1 views
1

У меня есть объект HashMap как часть моей Java модели, и когда я преобразовать его в XML, это результат ...HashMap итерация в XSLT 2.0

<transaction> 
    <claims> 
    <remarksMap> 
     <entry> 
     <string>XX</string> 
     <string>Description 1</string> 
     </entry> 
     <entry> 
     <string>YYY</string> 
     <string>Description 2</string> 
     </entry> 
     <entry> 
     <string>ZZZZ</string> 
     <string>Description 3</string> 
     </entry> 
    </remarksMap> 
    </claims> 
</transaction> 

Я хотел бы перебирать объект на карте в XSLT, но пока не повезло. Проводка кода примера из XSL ...

<xsl:for-each select="remarksMap/entry"> 
    <fo:table-row> 
    <fo:table-cell padding="3px" text-align="left"> 
     <fo:block font-size="7pt"> 
     <xsl:value-of select="string" /> 
     </fo:block> 
    </fo:table-cell> 
    </fo:table-row> 
</xsl:for-each> 

Выход для этого происходит следующим образом. Он печатает строку entrySet() в новой строке. ОЕ Описание 1 YYY Описание 2 ZZZZ Описание 3

Я бы в идеале хотел бы напечатать ключи в первом и значение во втором. Цените любую помощь по этому поводу!

P.S: Я использую XSL v2.0 и Saxon-HE: 9.4 в качестве процессора.

ответ

2

Что нужно сделать, это добавить второй xsl:for-each, чтобы перевернуть каждый string и создать fo:table-cell.

<xsl:for-each select="remarksMap/entry"> 
    <fo:table-row> 
     <xsl:for-each select="string"> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt"> 
        <xsl:value-of select="."/> 
       </fo:block> 
      </fo:table-cell>         
     </xsl:for-each> 
    </fo:table-row> 
</xsl:for-each> 

Вы можете также использовать подход толчок в стиле ...

XSLT 2,0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
        <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="my-page"> 
       <fo:flow flow-name="xsl-region-body"> 
        <xsl:apply-templates/> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

    <xsl:template match="entry"> 
     <fo:table-row> 
      <xsl:apply-templates/> 
     </fo:table-row> 
    </xsl:template> 

    <xsl:template match="string"> 
     <fo:table-cell padding="3px" text-align="left"> 
      <fo:block font-size="7pt"> 
       <xsl:value-of select="."/> 
      </fo:block> 
     </fo:table-cell>   
    </xsl:template> 

</xsl:stylesheet> 

XSL-FO Выход

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
     <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:table-row> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">XX</fo:block> 
      </fo:table-cell> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">Description 1</fo:block> 
      </fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">YYY</fo:block> 
      </fo:table-cell> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">Description 2</fo:block> 
      </fo:table-cell> 
     </fo:table-row> 
     <fo:table-row> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">ZZZZ</fo:block> 
      </fo:table-cell> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">Description 3</fo:block> 
      </fo:table-cell> 
     </fo:table-row> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 

Редактировать

После прочтения вашего вопроса во второй раз, это:

Я бы в идеале хотел бы напечатать ключи в первом и значение во втором.

почти похоже на то, что вы хотите только две ячейки со всеми ключами в первой ячейке и все значения во втором. Если это так, то вы могли бы сделать что-то вроде ...

XSLT 2,0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*/claims/remarksMap"> 
     <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
      <fo:layout-master-set> 
       <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
        <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
       </fo:simple-page-master> 
      </fo:layout-master-set> 
      <fo:page-sequence master-reference="my-page"> 
       <fo:flow flow-name="xsl-region-body"> 
        <fo:table-row> 
         <fo:table-cell padding="3px" text-align="left"> 
          <fo:block font-size="7pt"> 
           <xsl:value-of select="entry/string[1]" separator=", "/> 
          </fo:block> 
         </fo:table-cell>   
         <fo:table-cell padding="3px" text-align="left"> 
          <fo:block font-size="7pt"> 
           <xsl:value-of select="entry/string[2]" separator=", "/> 
          </fo:block> 
         </fo:table-cell>   
        </fo:table-row> 
       </fo:flow> 
      </fo:page-sequence> 
     </fo:root> 
    </xsl:template> 

</xsl:stylesheet> 

XSL-FO Выход

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> 
    <fo:layout-master-set> 
     <fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in"> 
     <fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/> 
     </fo:simple-page-master> 
    </fo:layout-master-set> 
    <fo:page-sequence master-reference="my-page"> 
     <fo:flow flow-name="xsl-region-body"> 
     <fo:table-row> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">XX, YYY, ZZZZ</fo:block> 
      </fo:table-cell> 
      <fo:table-cell padding="3px" text-align="left"> 
       <fo:block font-size="7pt">Description 1, Description 2, Description 3</fo:block> 
      </fo:table-cell> 
     </fo:table-row> 
     </fo:flow> 
    </fo:page-sequence> 
</fo:root> 
+0

Даниил, спасибо большое за быстрый ответ! Оба ваших решения работали для меня. К сожалению, у меня недостаточно репутации, чтобы поддержать свой ответ :( – psrikantan