2

ランダムテキスト内の http/s ベースの URL を変換して、 xsl-fo で自動的にタグ付けしたいと思います。ランダムテキストには、1 つ以上の http/s ベースの URL が含まれる場合があります。

そのため、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 です。

4

2 に答える 2

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 の末尾に 2 つのドットがあるなどのタイプミスがある場合、external-destination 属性が 1 つ取得されます。

于 2009-12-14T10:55:53.907 に答える
0

xsl:fo が何を意味するのかわかりませんが、実際に変換を行う xslt ファイルにアクセスできる場合は、ここで説明した xml 文字列関数を使用して自分で変換することができます。変換された出力のみにアクセスできる場合でも、

  • あなたが望むことをする別のxsltを適用するか、
  • SAX と Java 正規表現関数を使用して自分で変換する
于 2009-12-14T07:00:55.520 に答える