2016-07-23 4 views
-1

У меня есть XML-файл, который содержит значение столбца, мне нужно передать это как параметр в мой оператор xsl foreach. Ниже моя реализация, но я не получаю желаемого результата:Назначение переменной в инструкции XSL FO foreach

XML

 <PdfPrinter> 
     <Reports> 
     <Report> 
     <CreatedDate>2015-10-07T18:07:45</CreatedDate> 
     <LogType>ChangePassword</LogType> 
     <LoginID>ADMIN</LoginID> 
     <Name>XYZ</Name> 
     <AppVersion></AppVersion> 
     <System>OS</System> 
     <UserIPAddress>192.168.1.83</UserIPAddress> 
     <LoginDate /> 
     <LogoutDate /> 
     <Remarks></Remarks> 
     </Report> 
     <Report> 
     <CreatedDate>2015-10-07T18:09:54</CreatedDate> 
     <LogType>ChangePassword</LogType> 
     <LoginID>SUPERADMIN</LoginID> 
     <Name>ABC</Name> 
     <AppVersion></AppVersion> 
     <System>OS</System> 
     <UserIPAddress>192.168.1.83</UserIPAddress> 
     <LoginDate /> 
     <LogoutDate /> 
     <Remarks></Remarks> 
     </Report> 
     <Header> 
     <ReportID>AUD002</ReportID> 
     <GroupingColumn1>LoginID</GroupingColumn1> 
     <PrintedBy>SOS</PrintedBy> 
     <PrintedDate>2016-07-22T11:53:59.8826074Z</PrintedDate> 
     </Header> 
     </Reports> 
     </PdfPrinter> 

XSLT

//variable declaration 
<xsl:key name="Report" match="Report" use="$GroupingColumn" /> 
<xsl:variable name="GroupingColumn"> 
<xsl:value-of select="/PdfPrinter/Reports/Header/GroupingColumn1" /> 
</xsl:variable> 

//Usage of the assigned variable 
<xsl:for-each select="/PdfPrinter/Reports/Report[1]/*[local-name() !='$GroupingColumn']"> 
    <fo:table-column column-width="proportional-column-width(4.77)"/> 
</xsl:for-each> 

В XML, GroupingColumn1 может содержать любое значение, которое я должен передайте его на мой XSL foreach.

**My XSL TABLE** 

    <fo:table border-bottom-width="5pt" 
    width="1200pt" border-bottom-color="rgb(0,51,102)"> 
    <!--table header--> 
     <xsl:for-each select="/PdfPrinter/Reports/Report[1]/*[local-name() != 'LoginID']"> 
    <fo:table-column column-width="proportional-column-width(4.77)"/> 
    </xsl:for-each> 
    <fo:table-header> 
    <fo:table-row height="20.81pt" display-align="center" overflow="hidden"> 
    <xsl:for-each select="/PdfPrinter/Reports/Report[1]/*[local-name() != 'LoginID']"> 
    <fo:table-cell text-align="center" border="rgb(0, 0, 0) solid 1pt" padding="2pt"> 
     <fo:block color="rgb(0,0,0)" text-align="center" font-weight="normal"> 
     <xsl:value-of select="name()"/> 
     </fo:block> 
    </fo:table-cell> 
    </xsl:for-each> 
    </fo:table-row> 
    </fo:table-header> 
    <!--table body--> 
    <fo:table-body> 
    <xsl:for-each 
    select="PdfPrinter/Reports/Report[generate-id() = generate-id(key('Report', LoginID)[1])]"> 
    <fo:table-row> 
     <fo:table-cell number-columns-spanned="{count(*) - 1}"> 
     <fo:block><xsl:apply-templates select="LoginID" /></fo:block> 
    </fo:table-cell> 
    </fo:table-row> 
    <xsl:for-each select="key('Report', LoginID)"> 
    <fo:table-row display-align="before"> 
     <xsl:for-each select="*[local-name() != 'LoginID']"> 
     <fo:table-cell text-align="center" 
     border-top-color="rgb(0, 0, 0)" 
     border-top-style="solid" border-width="1pt" padding="2pt"> 
      <fo:block> 
      <xsl:value-of select="."/> 
      </fo:block> 
     </fo:table-cell> 
     </xsl:for-each> 
     </fo:table-row> 
     </xsl:for-each> 
     </xsl:for-each> 
     </fo:table-body> 
     </fo:table> 

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

+0

Вы XSL не имеет смысла против вашего входного XML. Не пытайтесь отрезать его и подумать, что мы можем понять. Пример: у вашего XSL есть xpath/PdfPrinter/Reports/Header/GroupingColumn1, который не существует нигде в вашем XML, чтобы он ничего не возвращал. Невозможно диагностировать ваша проблема с конкурирующей информацией. –

+0

@KevinBrown: Я реализую группу уровня 1 на основе значения GroupingColumn1 в XML, я должен передать значение GroupingColumn1 в свой XSL, как показано в приведенном выше фрагменте. Я думаю, что это просто назначение переменной, при необходимости я опубликую полный XSLT. Пожалуйста, порекомендуйте. Спасибо. –

+0

Любая помощь с благодарностью .. –

ответ

0

Другой ответ, данный мной, работает только в XSLT 2.0, как в XSLT 1.0 «Это ошибка для значения атрибута use или атрибута соответствия, содержащего ссылку на переменные». (См http://www.w3.org/TR/xslt#key)

Это возможно в XSLT 1.0, но это не будет очень эффективным, но попробовать этот XSLT

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

<xsl:variable name="GroupingColumn" select="/PdfPrinter/Reports/Header/GroupingColumn1" /> 

<xsl:template match="/PdfPrinter"> 
    <table> 
     <header> 
      <row> 
       <cell> 
        <xsl:value-of select="$GroupingColumn" /> 
       </cell> 
       <xsl:for-each select="Reports/Report[1]/*[local-name() != $GroupingColumn]"> 
        <cell> 
         <xsl:value-of select="local-name()" /> 
        </cell> 
       </xsl:for-each> 
      </row> 
     </header> 
     <body> 
      <xsl:variable name="distinct" select="Reports/Report[not(*[local-name() = $GroupingColumn] = preceding-sibling::Report/*[local-name() = $GroupingColumn])]" /> 
      <xsl:for-each select="$distinct"> 
       <xsl:variable name="current-grouping-key" select="*[local-name() = $GroupingColumn]" /> 
       <xsl:variable name="current-group" select="../Report[*[local-name() = $GroupingColumn] = $current-grouping-key]" /> 
       <xsl:for-each select="$current-group"> 
       <row> 
        <xsl:if test="position() = 1"> 
         <cell rowspan="{count($current-group)}"><xsl:value-of select="$current-grouping-key" /></cell> 
        </xsl:if> 
        <xsl:for-each select="*[local-name() != $GroupingColumn]"> 
        <cell> 
         <xsl:value-of select="." /> 
        </cell> 
        </xsl:for-each> 
       </row> 
       </xsl:for-each> 
      </xsl:for-each> 
     </body> 
    </table> 
</xsl:template> 
</xsl:stylesheet> 
+0

Спасибо большое. Немного изменил код и желаемый результат пришел .. Большое спасибо за помощь мне. –

+0

Мои искренние извинения, выше XSLT работает отлично. Протестировано и изменено в соответствии с моими требованиями. Спасибо.. –