2

xsltを介して画像の相対パスを絶対パスに変換する方法を概念化するのに苦労しています。

現在、<myHTML>HTML エンコードされたテキストを保持するセクションを持つ XML ドキュメントが存在します。この HTML ドキュメントには、相対パスのタグが含まれている場合があり<img>ます。例:<img src="myPic.jpg>

次のようなブロックでそのセクションを処理する xsl もあります。

<div id="bodyText">
  <xsl:value-of select="/abc:myT/abc:myHTML" disable-output-escaping="yes">
</div>

イメージ名の先頭に絶対パスを追加する必要があります。html ブロッ​​ク全体が 経由value-of selectでアクセスされているため、これを攻撃する方法がわかりません。

<img>パスを渡すには xsl 入力パラメーターを使用する必要があると思いますが、内のタグにアクセスする方法がわかりません<myHTML>

アドバイスをいただければ幸いです。

アップデート

XML ファイルの形式と、「html エンコードされたテキスト」の意味についていくつか質問がありました。タイプミスは無視してください。以下のチャンクはメモリからのもので、実際の xml ファイルを表しています。ブロックHtmlEncode()内のデータを説明するためのものです。<myHTML>

<?xml version="1.0" encoding="UTF-8">
<?xml-stylesheet ...snipped..>
<myT xmlns="abc">
   <myHTML>
      &lt;html$gt;&lt;head$gt;&lt;title$gt;This is my title&lt;/title$gt;&lt;/head$gt;
      &lt;body$gt;
      &lt;img src="myPic.jpg" /$gt;
      &lt;/body$gt;&lt;/html$gt;
   </myHTML>
</myT>

さらに、Dimitre が指摘したように、私は .NET を使用しており、それは XSLT 1.0 プロセッサです。

4

3 に答える 3

2

これに XLST を使用しなければならない正当な理由がない限り、XLST はこの作業には不適切なツールであると思います。XML ドキュメントを DOM および XPath にロードして、関連する myHtml 要素を含むノード セットを取得します。HTML をアンエスケープし、HTML パーサー (XHTML の場合は XML パーサー) にロードします。もう一度 XPath を使用して img 要素を取得し、href 属性を読み書きします。

いずれにせよ、問題の詳細で質問を更新できると助かります。XSLT の使用を強制する制約はありますか? (その場合、HTML は確実に正規表現できる方法でエスケープされていますか?) パフォーマンスは問題ですか? どのようなアプリケーションですか?などなど

于 2012-12-17T22:15:28.287 に答える
0

この完全で短く機能する変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:abc="some:abc" exclude-result-prefixes="abc">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pBase" select="'http://www.copm.com/'"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="abc:img[@src]">
  <xsl:element name="img" namespace="some:abc">
   <xsl:attribute name="src">
     <xsl:value-of select="concat($pBase, @src)"/>
   </xsl:attribute>
   <xsl:apply-templates select="@*[not(name()='src')]|node()"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

次の XML ドキュメントに適用した場合:

<myT xmlns="some:abc">
    <myHTML>
        <img src="myPic.jpg"/>
    </myHTML>
</myT>

必要な正しい結果が生成されます(要素srcの属性は、img指定された をパラメーター ベースとして使用して絶対値に変換されます)。

<myT xmlns="some:abc">
   <myHTML>
      <img src="http://www.copm.com/myPic.jpg"/>
   </myHTML>
</myT>

更新

Michael Kay が指摘したように、XSLT 2.0 以降では、標準の XPath 2.0 関数を使用する必要がありますresolve-uri()

ただし、OP のコメントから、彼が .NET XSLT プロセッサ、つまり XSLT 1.0 プロセッサを使用していることが明らかになりました。

于 2012-12-18T00:16:06.693 に答える
0

を使用するxsl:value-ofと、文字列を操作します。したがって、正規表現を使用できますが、それは不安定なようです。テンプレートを使用しないのはなぜですか?

<!-- XSL input param -->
<xsl:param name="absolute-path" select="'http://default-path/"></xsl:param>

...

<div id="bodyText">
  <xsl:apply-templates select="/abc:myT/abc:myHTML/node()"/>
</div>

...

<xsl:template match="abc:img">
  <img>
     <xsl:attribute name="src">
         <xsl:value-of select="concat($absolute-path,@src)"/>
     </xsl:attribute>
     <xsl:copy-of select="@* except @src"/>
  </img>
</xsl:template>

<xsl:template match="text()">
  <xsl:copy />
</xsl:template>
于 2012-12-17T22:00:16.463 に答える