2 Stimmen

Suche nach einem Wort und seinem Kontext

Ich muss ein Wort und seinen Kontext in einer Xml-Datei suchen. Zum Beispiel

<line>hello world, my name is farhad and i'm having trouble with xslt</line>

Suche nach "und", Kontext von 3 Wörtern:

<line>hello world, my <span class="context">name is farhad <span class="word">and</span> i'm having</span> trouble with xslt</line>

Was kann ich tun? Ich schrieb einige xslt, um das Wort zu finden, aber ich kann nicht gehen zurück 3 Wörter zu setzen span. Dies ist meine xslt:

<xsl:variable name="delimiters">[,.;!?\s"()]+</xsl:variable>

<xsl:template match="/">
    <xsl:apply-templates select="//line"/>
</xsl:template>

<xsl:template match="line">
    <line>
    <xsl:for-each select="tokenize(.,'\s')">
           <xsl:choose>
               <!-- se l'ultimo carattere è di punteggiatura, prendo la sottostringa senza la punteggiatura -->
               <xsl:when test="compare(replace(.,$delimiters,'$1'),'red') = 0">
                    <span class="word">
                        <xsl:value-of select="."/>
                    </span> 
               </xsl:when>
               <xsl:otherwise>
                       <xsl:value-of select="."/>
                        <xsl:choose>
                            <xsl:when test="position()=last()">
                                <xsl:text></xsl:text>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:text> </xsl:text>
                            </xsl:otherwise>
                        </xsl:choose>
               </xsl:otherwise>
           </xsl:choose>
    </xsl:for-each>
    </line><xsl:text>
    </xsl:text>

</xsl:template>

Dies ist ein Beispiel für xml: http://pastebin.com/eAVM9CDQ .

Ich muss zum Beispiel auch bei vorhergehenden Tags nach dem Kontext suchen:

  <line>hello world,</line>
<line>my name</line>
<line>is farhad </line>
<line>and i'm having</line>
<line>trouble with xslt</line>

also, auf der Suche nach 'und', Kontext von 3 Wörtern:

    <line>hello world,</line>
<line>my <span class="context">name</line>
<line>is farhad </line>
<line><span class="word">and</span> i'm having</span></line>
<line>trouble with xslt</line>

mit Überschneidungsproblemen, aber jetzt ist das kein Problem mehr (ich glaube, ich weiß, wie ich es hinbekomme). Wie kann ich ein Wort und seinen Kontext suchen? Ich danke Ihnen vielmals.

1voto

Lumi Punkte 14158

Sie kann mit XSLT 2.0 und einem geeigneten regulären Ausdruck gelöst werden:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="pattern" select="'never saw'"/>
<!-- globale Variable (statt Tunnel-Parameter) -->
<xsl:variable name="rex" select="concat(
        '((\w+\W+){0,3})',      (: leading context :)
        '(', $pattern, ')',     (: matched pattern :)
        '((\W+\w+){0,3})'       (: trailing context :)
    )"/>
<xsl:output indent="yes"/>

<xsl:template match="/">
    <xsl:apply-templates select="*" mode="set-context"/>
</xsl:template>

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

<xsl:template match="text()" mode="set-context">
    <xsl:analyze-string select="." regex="{ $rex }">
        <xsl:matching-substring>
            <span class="context">
                <xsl:value-of select="regex-group(1)"/>
                <span class="word">
                    <xsl:value-of select="regex-group(3)"/>
                </span>
                <xsl:value-of select="regex-group(4)"/>
            </span>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:copy-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:template>

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

</xsl:stylesheet>

Beachten Sie, dass die von Ihnen gewünschten überlappenden Bäume in XML unmöglich sind.

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