次のようなXMLがあります。
<article>
<title>Article 1 title</title>
<text>Lorem ipsum...</text>
<image>http://example.com/img_01.jpg</image>
</article>
<article>
<title>Article 2 title</title>
<text>Dolor sit amet...</text>
<image>http://example.com/img_02.jpg</image>
</article>
画像への相対パスのみを表示する必要があり、絶対パスを別のファイルに書き込む必要があります。と呼びましょうimg_to_download.html
。
これが私のアイデアです。image_src_download
for-each の反復ごとに 1 つの絶対パス文字列を追加する (関数f:download
を使用してパラメーターを指定する)という名前のグローバル変数が 1 つありますimage_src
。次に、for-each が終了したら、変数の内容をimage_src_download
別のファイルに入れますimg_to_download.html
。
私のXSLTは次のようになります。
<xsl:output method="html" encoding="UTF-8"/>
<xsl:variable name="image_src"/> <!-- this is for a single entry-->
<xsl:variable name="image_src_download"/> <!-- this should carry all sources to images -->
<!-- This function should append new string to the existing one in variable image_src_download -->
<xsl:function name="f:download">
<xsl:param name="newLink"/>
<xsl:variable name="image_src_download">
<xsl:value-of select="concat($image_src_download, $newLink, '\n')"/>
</xsl:variable>
</xsl:function>
<xsl:template match="/">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>All articles</title>
</head>
<body>
<xsl:for-each select="article">
<h1><xsl:value-of select="title"/></h1>
<p><xsl:value-of select="text"/></p>
<xsl:variable name="image_src">
<xsl:value-of select="image"/>
</xsl:variable>
<xsl:variable name="image_src_rel">
<xsl:value-of select="substring($image_src, 20)"/> <!-- Strips beggining of the absolute URL and leaves just relative path to the file -->
</xsl:variable>
<xsl:value-of select="f:download($image_src)"/> <!-- This should append absolute path string of the current article image to variable image_src_download -->
<p><img src="{$image_src_rel}" /></p>
</xsl:for-each>
</body>
</html>
<!-- Generates new file where there are absolute paths to images on each line-->
<xsl:result-document href="img_to_download.html" method="html">
<html>
<head>
<title>IMG to download</title>
</head>
<body>
<xsl:value-of select="$image_src_download"/>
</body>
</html>
</xsl:result-document>
</xsl:template>
私の望む出力は2つのファイルです。articles.html
次のようなファイル:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>All articles</title>
</head>
<body>
<h1>Article 1 title</h1>
<p>Lorem ipsum...</p>
<p><img src="img_01.jpg"/></p>
<h1>Article 2 title</h1>
<p>Dolor sit amet...</p>
<p><img src="img_02.jpg"/></p>
</body>
</html>
img_to_download.html
次のようなファイル:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>IMG to download</title>
</head>
<body>
<p>
http://example.com/img_01.jpg<br/>
http://example.com/img_02.jpg<br/>
</p>
</body>
</html>
これを機能させる方法を教えてください。
頑張れ、ジョニー