2

私はXSL-FOを初めて使用し、非常に基本的な質問があります。以下は xsl ファイルと xml ファイルです。
すべてのxmlノード「社内」(テンプレート一致)に対して「xxx」が出力されることを期待しています。しかし、私はそれを取得していません。

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:fo="http://www.w3.org/1999/XSL/Format">         
  <xsl:template match="CustomerData">    
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>        
        <fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21.0cm" margin-left="1.5cm" margin-right="1.5cm" margin-top="0cm">
          <fo:region-body margin-top="3cm"/>
          <fo:region-before extent="0cm"/>
          <fo:region-after extent="0cm"/>     
        </fo:simple-page-master>
      </fo:layout-master-set>  
      <fo:page-sequence master-reference="simple">                                 
        <fo:flow flow-name="xsl-region-body">  
            <fo:block font-family="Arial" font-size="8.5pt" font-weight="normal">       
                abc                             
            </fo:block>         
             <xsl:template match="inhouse">  
                <fo:block color="#053679">
                      xxx            
              </fo:block>                 
           </xsl:template>
        </fo:flow>      
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CustomerData>
    <inhouse>   
    <customerList>
        <customer>           
            <name>Tom</name>
        </customer>
    </customerList>  
  </inhouse>
</CustomerData>
4

1 に答える 1

1

ここでの問題は、CustomerDataのテンプレート マッチ内にインハウスのテンプレート マッチがあることです。

<xsl:template match="CustomerData">  
   ...
   <xsl:template match="inhouse">  
       ....
   </xsl:template>
   ....
</xsl:template>

このようにテンプレートをネストすることはできません。社内テンプレートを現在のテンプレートから移動する必要がありますが、代わりにxsl:apply-templatesを使用して、その時点で他のテンプレートの検索を開始するよう XSLT プロセッサに指示します。この構造のようなもの

<xsl:template match="CustomerData">  
   ...
   <xsl:apply-templates select="inhouse" />
   ...
</xsl:template>

<xsl:template match="inhouse">  
       ....
</xsl:template>

実際、これは、一致させたい社内以外の他の要素がある場合を処理するの<xsl:apply-templates select="inhouse" />と同じように、 に置き換える方が少し良いかもしれません.<xsl:apply-templates />

このXSLTを試してください

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"   xmlns:fo="http://www.w3.org/1999/XSL/Format">         
  <xsl:template match="CustomerData">    
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>        
        <fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21.0cm" margin-left="1.5cm" margin-right="1.5cm" margin-top="0cm">
          <fo:region-body margin-top="3cm"/>
          <fo:region-before extent="0cm"/>
          <fo:region-after extent="0cm"/>     
        </fo:simple-page-master>
      </fo:layout-master-set>  
      <fo:page-sequence master-reference="simple">                                 
        <fo:flow flow-name="xsl-region-body">  
            <fo:block font-family="Arial" font-size="8.5pt" font-weight="normal">       
                abc                             
            </fo:block>         
             <xsl:apply-templates />
        </fo:flow>      
      </fo:page-sequence>
    </fo:root>
  </xsl:template>

   <xsl:template match="inhouse">  
       <fo:block color="#053679">
         xxx            
        </fo:block>                 
    </xsl:template>
</xsl:stylesheet>
于 2013-05-24T21:39:01.167 に答える