【问题】
docbook中,对于这样的xml源码:
<para>本文章遵从:<ulink url="http://creativecommons.org/licenses/by-nc/2.5/cn/">署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5)</ulink></para>
生成的html是这样的:
这样的是我所要的效果,即带链接的文字,即可。
而生成的pdf中,却显示是这样的:
即,除了带链接的文字之外,还多余的显示出对应的链接地址,这个不是我所想要的,所以希望把pdf中多余显示出来的链接地址去掉。
【解决过程】
1.推断到,这些输入方面的内容控制,应该是对应的xls中控制的,所以就去到xsl中找对应的xlink方面的配置。
最后终于在xref中找到了:
<xsl:template match="d:ulink" name="ulink">
<xsl:param name="url" select="@url"/>
<xsl:variable name ="ulink.url">
<xsl:call-template name="fo-external-image">
<xsl:with-param name="filename" select="$url"/>
</xsl:call-template>
</xsl:variable>
<fo:basic-link xsl:use-attribute-sets="xref.properties"
external-destination="{$ulink.url}">
<xsl:choose>
<xsl:when test="count(child::node())=0 or (string(.) = $url)">
<xsl:call-template name="hyphenate-url">
<xsl:with-param name="url" select="$url"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</fo:basic-link>
<!-- * Call the template for determining whether the URL for this -->
<!-- * hyperlink is displayed, and how to display it (either inline or -->
<!-- * as a numbered footnote). -->
<xsl:call-template name="hyperlink.url.display">
<xsl:with-param name="url" select="$url"/>
<xsl:with-param name="ulink.url" select="$ulink.url"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="hyperlink.url.display">
<!-- * This template is called for all external hyperlinks (ulinks and -->
<!-- * for all simple xlinks); it determines whether the URL for the -->
<!-- * hyperlink is displayed, and how to display it (either inline or -->
<!-- * as a numbered footnote). -->
<xsl:param name="url"/>
<xsl:param name="ulink.url">
<!-- * ulink.url is just the value of the URL wrapped in 'url(...)' -->
<xsl:call-template name="fo-external-image">
<xsl:with-param name="filename" select="$url"/>
</xsl:call-template>
</xsl:param>
<xsl:if test="count(child::node()) != 0
and string(.) != $url
and $ulink.show != 0">
<!-- * Display the URL for this hyperlink only if it is non-empty, -->
<!-- * and the value of its content is not a URL that is the same as -->
<!-- * URL it links to, and if ulink.show is non-zero. -->
<xsl:choose>
<xsl:when test="$ulink.footnotes != 0 and not(ancestor::d:footnote)">
<!-- * ulink.show and ulink.footnote are both non-zero; that -->
<!-- * means we display the URL as a footnote (instead of inline) -->
<fo:footnote>
<xsl:call-template name="ulink.footnote.number"/>
<fo:footnote-body xsl:use-attribute-sets="footnote.properties">
<fo:block>
<xsl:call-template name="ulink.footnote.number"/>
<xsl:text> </xsl:text>
<fo:basic-link external-destination="{$ulink.url}">
<xsl:value-of select="$url"/>
</fo:basic-link>
</fo:block>
</fo:footnote-body>
</fo:footnote>
</xsl:when>
<xsl:otherwise>
<!-- * ulink.show is non-zero, but ulink.footnote is not; that -->
<!-- * means we display the URL inline -->
<fo:inline hyphenate="false">
<!-- * put square brackets around the URL -->
<xsl:text> [</xsl:text>
<fo:basic-link external-destination="{$ulink.url}">
<xsl:call-template name="hyphenate-url">
<xsl:with-param name="url" select="$url"/>
</xsl:call-template>
</fo:basic-link>
<xsl:text>]</xsl:text>
</fo:inline>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>2.找到了相关配置,但是却对于上述这么多内容,无从下手,不知道如何修改才能把对应的地址不显示。
不过后来看到了上面的url是否显示,是通过ulink.show来控制的。
然后就去找ulink.show,是在哪里配置的。结果xls文件中没有找到相关的配置。
3.然后就去网上找ulink.show,然后找到了这里:
参考其内容,本来以为是要把其中的:
<xsl:param name="ulink.show" select="1"></xsl:param>
写如到对应的xls或xml中,不过后来看到了xsl:param这个字眼,突然想到,估计也是类似之前使用xsltproc时候所用到的,通过stringparam传入进去的参数:
xsltproc.exe --stringparam section.autolabel 1 --stringparam section.label.includes.component.label 1 --stringparam bibliography.numbered 1 --xinclude -o /cygdrive/e/Dev_Root/docbook/dev/src/docbook/books/VBR/output/fo/MPEG_VBR.fo /usr/share/sgml/docbook/xsl-ns-stylesheets/fo/docbook_fo_crl_yahei.xsl /cygdrive/e/Dev_Root/docbook/dev/src/docbook/books/VBR/src/MPEG_VBR.xml
所以,就用下面的代码,去试试:
xsltproc.exe --stringparam section.autolabel 1 --stringparam section.label.includes.component.label 1 --stringparam bibliography.numbered 1 --stringparam ulink.show 0 --xinclude -o /cygdrive/e/Dev_Root/docbook/dev/src/docbook/books/VBR/output/fo/MPEG_VBR.fo /usr/share/sgml/docbook/xsl-ns-stylesheets/fo/docbook_fo_crl_yahei.xsl /cygdrive/e/Dev_Root/docbook/dev/src/docbook/books/VBR/src/MPEG_VBR.xml
然后再用fop将fo转换为pdf,结果就实现了所需要的效果了:
【总结】
想要输入的pdf中的带链接的文字后面的那个url地址不显示,可以通过给xsltproc传递参数:
| –stringparam ulink.show 0 |
这样,最终生成的pdf中,就不显示带链接的文字的后面的那个url地址了。


