2016-04-27 10 views
0

I aa Probe xml habe wie folgt,XSLT - platziert Selbstknotentext(), um Attribut

<doc> 
    <para>AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style>HHHHHH</para> 
</doc> 

XSLT Ich habe diesen Baum zu demselben Knoten zu transformieren, sondern ein Namensattribut zu <para> Knoten mit dem Namen 'name' hinzufügen und Der Wert sollte der Inhalt des Elements <para> sein.

So sollte die Ausgabe wie folgt aussehen werden,

<doc> 
    <p name="AAAAA BBB CCC DDD EEEE FFFFF GGGG HHHHHH">AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style>HHHHHH</p> 
</doc> 

Wie Sie in der Ausgabe sehen können, alle Textknoten mit dem Namen Attributwert ein und alle Inline-Elemente (<s/>,<t/>,<l/>,<style>) kopiert werden soll muss sein entfernt. und alle <s/>, <t/>, <l/> muss durch Platz ersetzt werden.

Ich habe folgende Xslt geschrieben dies,

<xsl:template match="p"> 
     <p name="{abc:process-attr-text(child::node())}"> 
      <xsl:apply-templates/> 
     </p> 
    </xsl:template> 

    <xsl:function name="abc:process-attr-text"> 
     <xsl:param name="node"/> 

     <xsl:sequence select="$node/text()"/> 
    </xsl:function> 

es ausgegeben folgenden ergibt,

<doc> 
    <p name="GGGG">AAAAA BBB<s/>CCC DDD<l/>EEEE<t/>FFFFF <style>GGGG</style> HHHHHH</p> 
</doc> 

wie kann ich meine Funktion ändern Sie das richtige Ergebnis zu bekommen?

Antwort

4

Das ist etwas umständlich, die offensichtliche Antwort von nur <p name="{.}"> verwendet, wird nicht funktionieren, weil es einfach alle geordneten Textknoten verketten würde, was AAAAA BBBCCC DDDEEEEFFFFF GGGGHHHHHH

Wenn Sie Wollen Sie sicherstellen, dass es Leerzeichen gibt, wo immer ein XML-Tag zwischen benachbarten Textknoten ist, dann müssen Sie etwas kreativer sein. Versuchen

<p name="{normalize-space(string-join(descendant::text(), ' '))}"> 

Diese alle Textknoten mit einem zusätzlichen Raum zwischen ihnen verbindet, dann wird der Normalisierungs zwei benachbarte Räume quetschen bis zu einem.

1

Warum nicht einfach:

<xsl:template match="para"> 
    <p name="{.}"> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 
Verwandte Themen