2009-12-14 93 views
2

我想要在隨機文本中轉換任何基於http/s的url,以便自動標記爲xsl-fo,其中隨機文本可能包含一個或多個基於http/s的url。如何使用xlst將xml轉換爲xsl-fo時創建超鏈接?

所以http/s url不是屬性的一部分,也不是節點的唯一內容,而是節點內部文本的一部分。

例如:源

<misc> 
    <comment>Yada..yada..yadda, see http://www.abc.com. 
      Bla..bla..bla.. http://www.xyz.com</comment> 
</misc> 

將被改造成類似:

<fo:block> 
    Yada..yada..yadda, see <fo:basic-link external-destination="http://www.abc.com">http://www.abc.com</fo:basic-link>. 
    Bla..bla..bla.. <fo:basic-link external-destination="http://www.xyz.com">http://www.xyz.com</fo:basic-link> 
<fo:/block> 

我們使用的庫是Apache的FOP和Xalan-J。

+0

您使用的是XSLT版本1還是2?後者在XPath 2.0中有更好的字符串操作函數,包括正則表達式匹配。 – 2009-12-14 08:50:47

回答

2

如果您必須使用純XSLT方法,你可以這樣做:

<xsl:template match="comment"> 
    <fo:block> 
    <xsl:call-template name="dig-links"> 
     <xsl:with-param name="content" select="."/> 
    </xsl:call-template> 
    </fo:block> 
</xsl:template> 
<xsl:template name="dig-links"> 
    <xsl:param name="content" /> 
    <xsl:choose> 
    <xsl:when test="contains($content, 'http://')"> 
     <xsl:value-of select="substring-before($content, 'http://')"/> 
     <xsl:variable name="url" select="concat('http://', substring-before(substring-after(concat($content, ' '), 'http://'), ' '))"/> 
     <fo:basic-link> 
     <xsl:attribute name="external-destination"> 
      <xsl:choose> 
      <xsl:when test="substring($url, string-length($url), 1) = '.'"> 
       <xsl:value-of select="substring($url, 1, string-length($url)-1)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$url"/> 
      </xsl:otherwise> 
      </xsl:choose> 
     </xsl:attribute> 
     <xsl:value-of select="$url"/> 
     </fo:basic-link> 
     <xsl:call-template name="dig-links"> 
     <xsl:with-param name="content" select="substring-after($content, $url)"/> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$content"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

這不是一個完美的解決方案。然而,這樣如果你有錯別字,如兩個點在URL中,外耳炎結束l-destination屬性將獲得一個。

0

我不知道是什麼XSL:FO的手段,但如果你有機會獲得實際執行轉換的XSLT文件,你可以自己通過使用XML字符串函數將其轉換提到here。如果你有機會到變換的輸出而已,你還可以

  • 應用另一個XSLT,你想要做什麼,或者
  • 使用SAX和使用java正則表達式的功能自己改造它