我是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>
答案 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>