3 Stimmen

XSLT - Ersetzen von Apostroph mit escaped Text in der Ausgabe

Ich schreibe eine XSLT-Vorlage, die eine gültige Xml-Datei für eine Xml-Sitemap ausgeben muss.

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

Leider enthält die ausgegebene Url ein Hochkomma - /what's-new.aspx

Ich muss dem " zu entkommen &apos; für Google Sitemap. Leider behandelt jeder Versuch, den ich unternommen habe, die Zeichenfolge ' &apos; ', als ob es ''' wäre, was ungültig ist - das ist frustrierend. XSLT kann mich manchmal in den Wahnsinn treiben.

Irgendwelche Ideen für eine Technik? (Vorausgesetzt, ich kann mich mit XSLT 1.0-Vorlagen und -Funktionen zurechtfinden)

9voto

Welbog Punkte 57431

Sie haben also ' in Ihrer Eingabe, aber Sie brauchen die Zeichenfolge &nbsp; in Ihrer Ausgabe?

Ersetzen Sie in Ihrer XSL-Datei &apos; con &amp;apos; を使用しています。 diese Suchen/Ersetzen-Implementierung (es sei denn, Sie verwenden XSLT 2.0):

<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>

Sagen wir es mal so:

<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>

Das Problem ist &apos; wird von XSL interpretiert als ' . &amp;apos; wird interpretiert als &apos; .

1voto

Myster Punkte 17027

Die einfache Möglichkeit, unerwünschte Zeichen aus Ihrer URL zu entfernen, besteht darin, die Regeln zu ändern, die umbraco bei der Generierung der NiceUrl verwendet.

Bearbeiten Sie die Datei config/umbracoSettings.config

eine Regel hinzufügen, um alle Apostrophe aus NiceUrls zu entfernen, etwa so:

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

Hinweis: Der Inhalt des Attributs "org" wird durch den Inhalt des Elements ersetzt, hier ein weiteres Beispiel:

<char org="+">plus</char> <!-- replace + with the word plus -->

0voto

Stephen Denne Punkte 35003

Haben Sie versucht, die disable-output-escaping für Ihr xsl:value-of-Element auf yes setzen:

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

Eigentlich ist das wahrscheinlich das Gegenteil von dem, was Sie wollen.

Wie wäre es, das xsl:value-of in ein xsl:text-Element einzuschließen?

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

Vielleicht sollten Sie versuchen zu übersetzen ' a &amp;apos;

0voto

Gaurav Balyan Punkte 1

Dies wird funktionieren, Sie müssen nur ZWEI Parameter wie unten angegeben ändern

<xsl:with-param name="replace">&apos;</xsl:with-param>
<xsl:with-param name="by" >AnyString</xsl:with-param>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X