2016-08-17 17 views
0

私は以下のようなXMLを持っていますが、私はXSL FO XSLT transforamtionを使ってPDFを生成しています。 XML要素間にスペースを追加してPDFの表の列として表示する方法は?xml要素間にスペースを追加する方法xslt変換

<Reports> 
<Report> 
<BatchDate>2016-08-10T00:00:00</BatchDate> 
<ClientAccountNo>ABCDE01384</ClientAccountNo> 
<Source>N</Source> 
<CDSNo>0000001387</CDSNo> 
<Price>0.123000</Price> 
<Qty>-1200</Qty> 
<TCurrency>USD</TCurrency> 
<TNettAmt>0</TNettAmt> 
<LCurrency>USD</LCurrency> 
<LNettAmt>-86.600000</LNettAmt> 
<PromotionInd>N</PromotionInd> 
<BrkChgID>BRK-N</BrkChgID> 
<BrkChgAmt>50.000000</BrkChgAmt> 
<ClrChgID>CLR</ClrChgID> 
<ClrChgAmt>10.000000</ClrChgAmt> 
<SdcChgID>SDC</SdcChgID> 
<SdcChgAmt>1.000000</SdcChgAmt> 
<BinChgID /> 
<BinChgAmt>0</BinChgAmt> 
<OthChgAmt>0.000000</OthChgAmt> 
<TaxAmt>0.000000</TaxAmt> 
</Report> 
</Reports> 

上記のXMLをouputtingながら、私は、私たちはTaxAmtてみましょう、例えばのようなXML要素の間にスペースを追加する必要があり、私は税AMTのような出力にそれを必要とします。これどうやってするの?以下は私のXSLTです

<fo:table role="html:table" table-layout="auto" inline-progression-dimension="auto" line-height="2.5" width="100%" border="0px" border-collapse="collapse" border-spacing="3px" border-style="outset hidden" space-before.conditionality="retain" space-after.conditionality="retain" space-after="1em" space-before="1em"> 
      <!--table header--> 
      <xsl:for-each select="//Reports/Report[1]/*"> 
      <fo:table-column column-width="proportional-column-width(4.77)" font-family="sans-serif" font-size="medium" /> 
      </xsl:for-each> 
      <fo:table-header> 

      <fo:table-row height="auto" color="#FFFFFF" background-color="#A1A1A1" text-align="center" font-weight="bold" font-family="sans-serif" font-size="medium"> 
       <xsl:for-each select="/Reports/Report[1]/*"> 
       <fo:table-cell text-align="center"> 
        <fo:block font-size="medium" font-family="sans-serif"> 
        <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="/Reports/Report"> 
       <fo:table-row display-align="before"> 
       <xsl:for-each select="*"> 
        <fo:table-cell text-align="center" border-top-color="rgb(255, 255, 255)" border-top-style="solid" border-width="1pt" padding="2pt"> 
        <fo:block font-size="medium" font-family="sans-serif"> 
         <xsl:text> </xsl:text> <xsl:value-of select="."/> 
        </fo:block> 
        </fo:table-cell> 
       </xsl:for-each> 
       </fo:table-row> 
      </xsl:for-each> 
      </fo:table-body> 
     </fo:table> 
+0

だけ明確にするために - あなたは前にすべてのスペースを追加することを意味要素名の大文字ですか?それがあなたが求めているものなら、あなたはそれを少し明確にすることができます。 –

+0

私はすべてのXML要素を人間が理解できるように、レポートにレンダリングする必要があります。現在、私のXML要素はすべてデータベースの列です。例えば、私の場合、エンドユーザは取引通貨であるべき要素TCurrencyを理解できません。 –

答えて

0

次のテンプレートコールでは、大文字の前にスペースを挿入します。スペースの最初の出現は、XSLフォーマットエンジンによって無視されます。

<!--xsl:value-of select="name()"/--> 
<xsl:call-template name="insertSpaceBeforeUCase"> 
    <xsl:with-param name="prmStr" select="name()"/> 
</xsl:call-template> 

... 
<xsl:template name="insertSpaceBeforeUCase"> 
    <xsl:param name="prmStr" select="''"/> 
    <xsl:variable name="firstChar" select="substring($prmStr,1,1)"/> 
    <xsl:if test="translate($firstChar,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','')=''"> 
     <xsl:text>&#x20;</xsl:text> 
    </xsl:if> 
    <xsl:value-of select="$firstChar"/> 
    <xsl:if test="string-length($prmStr) &gt; 1"> 
     <xsl:call-template name="insertSpaceBeforeUCase"> 
      <xsl:with-param name="prmStr" select="substring($prmStr,2)"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

このテンプレート呼び出しによって、「TaxAmt」は「Tax Amt」に変換されます。しかし、 "ClrChgID"は "Sdc Chg I D"に変換されます。後者はあなたが望むものではないかもしれません。

XSLT 1.0には文字列処理に制限があります。スタイルシートをXSLT 2.0に移すことができる場合は、この質問の別の解決策があります。

[補遺]

ビット洗練されたバージョンはここにある:このテンプレートは、XSL-FO次生成

<xsl:template name="insertSpaceBeforeUCase"> 
    <xsl:param name="prmStr" select="''"/> 
    <xsl:param name="prmPrevChar" select="''"/> 
    <xsl:variable name="firstChar" select="substring($prmStr,1,1)"/> 
    <xsl:variable name="nextChar" select="substring($prmStr,2,1)"/> 
    <xsl:if test="(translate($firstChar,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','') = '') 
     and ($prmPrevChar != '') 
     and ((translate($prmPrevChar,'abcdefghijklmnopqrstuvwxyz','') = '') or ($nextChar != '') and (translate($nextChar,'abcdefghijklmnopqrstuvwxyz','') = ''))"> 
     <xsl:text>&#x20;</xsl:text> 
    </xsl:if> 
    <xsl:value-of select="$firstChar"/> 
    <xsl:if test="string-length($prmStr) &gt; 1"> 
     <xsl:call-template name="insertSpaceBeforeUCase"> 
      <xsl:with-param name="prmStr" select="substring($prmStr,2)"/> 
      <xsl:with-param name="prmPrevChar" select="$firstChar"/> 
     </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

<fo:table-row height="auto" color="#FFFFFF" background-color="#A1A1A1" text-align="center" font-weight="bold" font-family="sans-serif" font-size="medium"> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Batch Date</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Client Account No</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Source</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">CDS No</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Price</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Qty</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">T Currency</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">T Nett Amt</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">L Currency</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">L Nett Amt</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Promotion Ind</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Brk Chg ID</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Brk Chg Amt</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Clr Chg ID</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Clr Chg Amt</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Sdc Chg ID</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Sdc Chg Amt</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Bin Chg ID</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Bin Chg Amt</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Oth Chg Amt</fo:block> 
    </fo:table-cell> 
    <fo:table-cell text-align="center"> 
     <fo:block font-size="medium" font-family="sans-serif">Tax Amt</fo:block> 
    </fo:table-cell> 
    </fo:table-row> 
+0

助けてくれてありがとうございました。 –

+0

この質問をご覧ください。 [リンク](http://stackoverflow.com/questions/39013164/strip-encoded-values-between-xml-elements-and-namespaces-in-xslt-1-0) –

+0

上記のテンプレートを適用するには、私のXSLT?このXSLTの使い方を教えてください –

関連する問題