代码之家  ›  专栏  ›  技术社区  ›  jbrehr

格式化期间两个模板的xsl或xsl:fo交互

  •  1
  • jbrehr  · 技术社区  · 6 年前

    在转换大型XML文本语料库(转换为PDF、XSL 3.0、XSL:FO)时,我遇到了一个模板问题,即控制最终出现在输出正文中的内容以及由一个元素导致的边距中的内容。我不确定这是xsl还是xsl:fo问题。

    问题在于元素的输出 <add type="margin_gloss"> ,由模板处理 <xsl:template match="seg[@type='dep_event']"> <xsl:template match="add[@type='margin_gloss']"> 在下面的示例中。我希望 <添加type=“margin\u gloss”> 仅出现在页边空白处;但它也在体内持续存在。

    此xml标记:

    <corpus>
      <deposition>
        <text>
            <deposition-title>Some foo title</deposition-title>
            <seg type="dep_event"> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vitae venenatis
                ante. Suspendisse posuere velit non nisi tincidunt, commodo faucibus neque volutpat.
                Integer <add type="margin_gloss">This is a <foreign>foo</foreign> ma<supplied reason="added">rgin</supplied> note</add> 
                posuere laoreet sem eu scelerisque. Vestibulum purus risus, semper
                vitae suscipit non, mal<supplied reason="added">esuada</supplied> ut massa. Sed et auctor erat.</seg>
            <seg type="dep_event"> Suspendisse eu urna sed purus mattis placerat. Vestibulum <foreign>some English</foreign> scelerisque
                lectus, in lobortis tortor fa<supplied reason="added">cilisis</supplied> eu. Donec mollis pulvinar varius. Nam eget
                euismod ipsum, ac suscipit nunc. Sed volutpat non felis id varius. </seg>
        </text>
    </deposition>
    </corpus>
    

    由以下xsl:fo处理:

    <xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:xd="http://www.pnp-software.com/XSLTdoc"
    version="3.0">
    
    <xsl:template match="/">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master 
                    master-name="page-recto"
                    page-height="29.7cm"  page-width="21cm"
                    margin-top="2cm" margin-bottom="2cm" 
                    margin-left="2cm" margin-right="1cm">
                    <fo:region-body 
                        region-name="xsl-region-body"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
    
            <fo:page-sequence master-reference="page-recto">
                <fo:flow flow-name="xsl-region-body" 
                    font-family="Times" font-weight="normal" 
                    font-size="8pt" space-before="8pt" space-after="8pt"
                    text-align="justify" end-indent="120pt">
                    <xsl:apply-templates/>
                </fo:flow>
            </fo:page-sequence>
    
        </fo:root>
    </xsl:template>
    
    <xsl:template match="text">
        <fo:block 
            page-break-inside="avoid"
            font-size="9pt" font-weight="bold" 
            padding-bottom="1cm" end-indent="120pt">
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    
    <xsl:template match="seg[@type='dep_event']">
        <fo:block
            font-family="Times" font-weight="normal"
            font-size="8pt" space-before="8pt"
            space-after="8pt" text-align="justify"
            end-indent="2.5in">
            <xsl:if test=".//add[@type='margin_gloss']">
                <fo:float float="right">
                    <fo:block-container width="2in" margin="10pt">
                        <fo:block font-size="7pt">
                                <xsl:apply-templates select=".//add[@type='margin_gloss']"/>
                        </fo:block>
                    </fo:block-container>
                </fo:float>
            </xsl:if>
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    
    <xsl:template match="add[@type='margin_gloss']">
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="foreign">
        <fo:inline font-style="italic">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>
    
    <xsl:template match="supplied[@reason='added']">
        <xsl:text>[</xsl:text><xsl:apply-templates/><xsl:text>]</xsl:text>
    </xsl:template>
    
    
    </xsl:stylesheet>
    

    生成此问题输出-的格式化内容 <添加type=“margin\u gloss”> (我用黄色突出显示)应仅出现在页边空白处,而不是正文中:

    Yellow highlighted text should only appear in the margin, not the body

    我试过各种形式的 <apply-templates> 但他们要么破坏/忽略保证金注释中的加价(例如: <xsl:apply-templates select="descendant::add[@type='margin_gloss']/text()"/> ),或完全消失边距注释。

    我应该注意到,我使用xsl:fo处理器RenderX来完全支持 <fo:float> .

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tim C    6 年前

    问题是你的 <add type="margin_gloss"> 正在选择两次。首先通过这行。。。

    <xsl:apply-templates select=".//add[@type='margin_gloss']"/>
    

    然后通过这条线。。。

    <xsl:apply-templates/>
    

    解决这个问题的一种方法是更改显式 xsl:apply-templates 对此。。。

    <xsl:for-each select=".//add[@type='margin_gloss']">
        <xsl:apply-templates />
    </xsl:for-each>
    

    然后,更改模板匹配 add[@type='margin_gloss'] 这将阻止 xsl:应用模板

    <xsl:template match="add[@type='margin_gloss']" />
    

    因此,这两个相关模板将如下所示。。。。

    <xsl:template match="seg[@type='dep_event']">
        <fo:block
            font-family="Times" font-weight="normal"
            font-size="8pt" space-before="8pt"
            space-after="8pt" text-align="justify"
            end-indent="2.5in">
            <xsl:if test=".//add[@type='margin_gloss']">
                <fo:float float="right">
                    <fo:block-container width="2in" margin="10pt">
                        <fo:block font-size="7pt">
                            <xsl:for-each select=".//add[@type='margin_gloss']">
                                <xsl:apply-templates />
                            </xsl:for-each>
                        </fo:block>
                    </fo:block-container>
                </fo:float>
            </xsl:if>
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    
    <xsl:template match="add[@type='margin_gloss']"/>