xsl:模板匹配xml节点

时间:2013-05-24 21:26:21

标签: xslt xsl-fo

我是XSL-FO的新手并且有一个非常基本的问题,以下是xsl和xml文件。
我希望每个xml节点“inhouse”(模板匹配)输出“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>

1 个答案:

答案 0 :(得分:0)

此处的问题是,您在 CustomerData

模板匹配中的内部模板匹配
<xsl:template match="CustomerData">  
   ...
   <xsl:template match="inhouse">  
       ....
   </xsl:template>
   ....
</xsl:template>

您不能以这种方式嵌套模板。您需要做的是将内部模板从当前模板中移出,而是告诉XSLT处理器使用 xsl:apply-templates 。像这样的结构

<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 />可能稍微好一点,因为这样可以处理除了 inhouse 之外的其他元素的情况。

试试这个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>