XSL-FO图像路径问题-将反斜杠更改为正斜杠

时间:2018-12-12 21:37:29

标签: xml xslt xsl-fo apache-fop

我有以下abc.xml代码段。

<abc>Images\Image.JPG</abc>

,我想将此图像显示为PDF。我正在使用Apache FOP使用XSL-FO将XML转换为PDF。不幸的是,我无法找到一种巧妙的方法来将反斜杠替换为正斜杠。这是我正在使用的一些xsl代码:

<fo:external-graphic> <xsl:variable name="fixTest">file:///<xsl:value-of select="abc"/> <xsl:attribute name="src" select="'{translate(@fixTest, '\','/')}'"/> </fo:external-graphic>

我也尝试过一些代码,但都无济于事。现在,我知道一旦弄清楚如何用XSL-FO文件将“ \”替换为“ /”,便可以显示图像。但是,现在我不知道该怎么做。

<xsl:attribute name="src"><xsl:value-of select="concat('file:///',translate(@abc, '\', '/'))"/></xsl:attribute>

是否有人知道如何在元素abc的文本值中将'\'转换为'/',因此我也可以将file:///连接到该值并将其设置为我的{{是src的1}}属性?

2 个答案:

答案 0 :(得分:2)

这个时间太长,无法写评论,但是在您的问题中,您表明自己正在这样做...

export class AreaDistinguisher extends React.Component<AreaDistinguisherProps, {}> {
    public render() {
        switch (this.props.targetDisplay) {
            case "page":
                return this.buildPageDisplay();
            case "report":
                return this.buildReportDisplay();
            case "tour":
                return this.buildTourDisplay();
            default:
                return <div />;
        }
    }

    private buildPageDisplay(): JSX.Element {
        return <PageDisplay2    id={this.props.targetId}
                                onRelatedMenusChanged={(relatedMenus: RelatedMenu[]) => this.props.onRelatedMenusChanged(relatedMenus)} />;
    }

    private buildReportDisplay(): JSX.Element {
        return <Report2Display />;
    }

    private buildTourDisplay(): JSX.Element {
        return <TourDisplay menu={this.props.menu} />;
    }
}

(尽管,正如您继续显示的那样,这里实际上应该是<xsl:attribute name="src" select="'{translate(@fixTest, '\','/')}'"/> ,而不是.

但是,这意味着您将撇号嵌套在以撇号分隔的字符串中,这是一种语法错误。因此,您应该编写此文件以使其在语法上正确。

@fixTest

但这将向您显示问题所在。 <xsl:attribute name="src" select="'{translate(@fixTest, &quot;\&quot;,&quot;/&quot;)}'"/> 需要一个表达式。通过使用撇号对表达式进行定界,您已将其转换为字符串文字,因此该表达式不会得到求值。但是您无需在此处使用撇号或花括号。你应该写这个。。。

select

或者,添加“ file:///”前缀。...

<xsl:attribute name="src" select="translate(., '\', '\')"/>

但是有一种简单的方法,其中花括号(也称为“属性值模板”)确实适用,那就是编写此代码...

<xsl:attribute name="src" select="concat('file:///',translate(., '\', '/'))"/>

在这里,<fo:external-graphic src="file:///{translate(., '\', '/')}"> 属性确实需要一个字符串,然后使用花括号将其用于评估表达式。

答案 1 :(得分:0)

好的,所以我想出了自己的问题。我没有包含我的<xsl:template match="abc">元素,因为我认为这对我的问题不重要。因此,我需要做的是使用.引用自己的模板值,同时在此处设置src属性

<xsl:attribute name="src"><xsl:value-of select="concat('file:///',translate(., '\', '/'))"/></xsl:attribute>

下面是我的xsl代码的整个摘要。

<xsl:template match="abc"> <fo:block xsl:use-attribute-sets="abc"> <fo:external-graphic> <xsl:attribute name="src"><xsl:value-of select="concat('file:///',translate(., '\', '/'))"/></xsl:attribute> </fo:external-graphic> <xsl:apply-templates/> </fo:block> </xsl:template>