2 Stimmen

Abgleichen verschiedener Knoten-Handles, um einen Knotenwert mit XSLT zu erhalten

XSLT ist in der Version 1.0 verfügbar.

Ich arbeite an einer zweisprachigen Website in einem XML-basierten CMS (Symphony CMS) und muss die englische Version eines Kategorienamens durch die französische Version ersetzen.

Dies ist meine XML-Quelle.

<data>
    <our-news-categories-for-list-fr>
        <entry id="118">
            <title-fr handle="technology">Technologie</title-fr>
        </entry>
        <entry id="117">
            <title-fr handle="healthcare">Santé</title-fr>
        </entry>
    </our-news-categories-for-list-fr>
    <our-news-article-fr>
        <entry id="100">
            <categories>
                <item id="117" handle="healthcare" section-handle="our-news-categories" section-name="Our News categories">Healthcare</item>
                <item id="118" handle="technology" section-handle="our-news-categories" section-name="Our News categories">Technology</item>
            </categories>
            <main-text-fr mode="formatted"><p>Blah blah</p></main-text-fr>
        </entry>
    </our-news-article-fr>
</data>

Dies ist ein Teil der XSLT, die ich derzeit für die französische Version habe.

<xsl:template match="data">
    <xsl:apply-templates select="our-news-article-fr/entry"/>
</xsl:template>

<xsl:template match="our-news-article-fr/entry">
    <xsl:if test="categories/item">
        <p class="category">In:</p>
        <ul class="category">
            <xsl:for-each select="categories/item">
                <li><a href="{/data/params/root}/{/data/params/root-page}/our-news/categorie/{@handle}/"><xsl:value-of select="."/></a></li>
            </xsl:for-each>
        </ul>
    </xsl:if>
</xsl:template match>

Das Problem: Der sichtbare Text des Ankers ( <xsl:value-of select="."/> ) gibt die englische Version des Kategorietitels an.

Die Handles der folgenden Knoten stimmen überein (alle Handles sind in englischer Sprache), so dass ich denke, dass ich in der Lage sein sollte, den einen mit dem anderen abzugleichen.

/data/our-news-categories-for-list-fr/entry/title-fr/@handle (der Wert des Knotens title-fr ist die französische Übersetzung des Titels der Kategorie)

/data/our-news-article-fr/entry/categories/item/@handle

Ich bin neu in XSLT und kämpfe damit, herauszufinden, wie man das macht.

Vielen Dank!

1voto

MikeyKennethR Punkte 594
../our-news-categories-for-list-fr/entry/title-fr/text() instead of @handle should do it 

Your problem is that you are in 
   <our-news-article-fr> 
and need to reference
   <our-news-categories-for-list-fr>

also mache ich einen Elternteil .., um den Baum hinaufzugehen und dann die Eintragsknoten hinunter

1voto

Martin Honnen Punkte 148915

Hinzufügen <xsl:key name="k1" match="our-news-categories-for-list-fr/entry" use="@id"/> als untergeordnetes Element Ihres XSLT-Stylesheet-Elements. Verwenden Sie dann z.B. <li><a href="{/data/params/root}/{/data/params/root-page}/our-news/categorie/{@handle}/"><xsl:value-of select="key('k1', @id)/title-fr"/></a></li> .

1voto

Emiliano Poggi Punkte 23692

Innerhalb der xsl:for-each Wiederholungsbefehl, der Kontext ist our-news-article-fr/entry/categories/item . Wenn Sie . Sie wählen den aktuellen Kontext, deshalb erhalten Sie dort die englische Version.

Ein anderer Ansatz (der nicht unbedingt der einfachste und beste ist) besteht darin, einfach einen XPath-Ausdruck anzugeben, der den richtigen Knoten ausfindig macht. Sie können den ancestor:: Achse, um aus dem aktuellen Kontext herauszugehen zu data und verwenden Sie dann Ihren Testknoten. Das benötigte Prädikat muss mit dem aktuellen Kontext übereinstimmen. current() Funktion:

<xsl:value-of select="
    ancestor::data[1]/
     our-news-categories-for-list-fr/
      entry/
       title-fr
       [@handle=current()/@handle]
 "/>

Si data die Wurzel Ihres Dokuments ist, können Sie natürlich einen absoluten Speicherpfad verwenden:

     /
     data/
      our-news-categories-for-list-fr/
       entry/
        title-fr
        [@handle=current()/@handle]

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