2009-07-09 23 views
3

xmlサイトマップに有効なxmlファイルを出力する必要があるXSLTテンプレートを作成しています。私は「グーグルマップのための'にをエスケープする必要がXSLT - 出力のエスケープされたテキストにアポストロフィを置き換えます。

/what's-new.aspx -

<url> 
<loc> 
    <xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/> 
</loc> 
<lastmod> 
    <xsl:value-of select="concat($node/@updateDate,'+00:00')"/> 
</lastmod> 
</url> 

残念ながら、出力されているURLは、アポストロフィが含まれています。残念ながら、私が試したすべての試みは、 '&apos;'という文字列を、あたかも無効であるように扱います。 XSLTは時々私を怒らせることができます。

テクニックのアイデアはありますか? (私はXSLT 1.0テンプレートや機能の周りに自分の道を見つけることができると仮定)

答えて

9

&amp;apos;翻訳してみる必要がありますが、あなたはあなたの出力内の文字列&nbsp;が必要ですか?問題は&apos;が解釈されている

<loc> 
    <xsl:call-template name="string-replace-all"> 
    <xsl:with-param name="text" select="umbraco.library:NiceUrl($node/@id)"/> 
    <xsl:with-param name="replace" select="&apos;"/> 
    <xsl:with-param name="by" select="&amp;apos;"/> 
    </xsl:call-template> 
</loc> 

<xsl:template name="string-replace-all"> 
    <xsl:param name="text"/> 
    <xsl:param name="replace"/> 
    <xsl:param name="by"/> 
    <xsl:choose> 
    <xsl:when test="contains($text,$replace)"> 
     <xsl:value-of select="substring-before($text,$replace)"/> 
     <xsl:value-of select="$by"/> 
     <xsl:call-template name="string-replace-all"> 
     <xsl:with-param name="text" select="substring-after($text,$replace)"/> 
     <xsl:with-param name="replace" select="$replace"/> 
     <xsl:with-param name="by" select="$by"/> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

はこのようにそれを呼び出す:あなたのXSLファイルで

、(あなたがXSLT 2.0を使用している場合を除き)this find/replace implementationを使用して、&amp;apos;&apos;を置き換えますXSLでは'となります。 &amp;apos;&apos;と解釈されます。

+0

ありがとうございました –

+0

'select =" & apos; "'構文エラーを出します:式の中に予期しないトークン '&'があります。 - >&< - apos; –

+0

エラーが発生しました:文字列リテラルが閉じられませんでした。 - > '< - –

0

あなたは、XSLのためにyesにdisable-output-escapingを設定してみました:価値の要素:

<xsl:value-of disable-output-escaping="yes" select="umbraco.library:NiceUrl($node/@id)"/> 

が実際に - これはおそらく何の反対でありますあなたは欲しい。

xsl:value-ofをxsl:text要素にラップするのはどうですか?

<xsl:text><xsl:value-of select="umbraco.library:NiceUrl($node/@id)"/></xsl:text> 

おそらくあなたは、あなたがあなたの入力で'を持って'

+0

おかげで以下に示すように2つのparamsを変更する必要があります$ aposという変数を 'と置き換えて、$ aposを' ' 'に置き換えようとしました。残念なことにXSLTは''を '' ' grrr –

1

URLから不要な文字を削除する簡単な方法は、umbracoがNiceUrlを生成するときに使用するルールを変更することです。

config/umbracoSettingsを編集します。コンフィグ

はそうのようなNiceUrlsからすべてのアポストロフィを削除するルールを追加します:

<urlReplacing> 
    ... 
    <char org="'"></char>  <!-- replace ' with nothing --> 
    ... 
</urlReplacing> 

注:

:「ORG」属性の内容は、要素の内容に置き換えられ、ここで別の例です
<char org="+">plus</char> <!-- replace + with the word plus --> 
+0

チップをありがとう。私はそれをローカルのdevboxで試してみて、小さな副作用を見つけました。置き換えは、設定の変更後に公開されるノードにのみ適用されます。これらの文字を持つ既存のノードは再公開する必要があります。その中にたくさんのリンクがある複雑なサイトでは、URL書き換えルールを追加する必要があります( –

+0

)サイト全体を再公開することができますあなたがブックマークしたURLは間違っているかもしれませんが、内部リンクは更新されるべきです。それがうまくいかない場合は、 "難しい再発行"をしなければならないかもしれません – Myster

0

これは動作しますが、あなたはちょうど私が試した

<xsl:with-param name="replace">&apos;</xsl:with-param> 
<xsl:with-param name="by" >AnyString</xsl:with-param> 
関連する問題