2016-09-20 1 views
1

Hier ist eine abgeschwächte Version meines Anwendungsfalls. Ich habeexsl: node-set ruft den Wert des Attributs nicht ab

XSL-Datei für die Transformation

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> 

<xsl:output method="text"/> 
<xsl:template match="Message"> 
    <xsl:for-each select="ent"> 
     <xsl:variable name="current_key" select="@key"/> 
     <xsl:variable name="current_type" select="@type"/> 
     <xsl:variable name="Match" select="exsl:node-set(msg)/ent"/> 
     <xsl:copy> 
      <xsl:copy-of select="exsl:node-set($Match)/@type"/> 
      <xsl:copy-of select="exsl:node-set($Match)/@key|exsl:node-set($Match)/translation/text()"/> 
      <!--- <xsl:copy-of select="exsl:node-set($Match)/@key|exsl:node-set($Match)/translation/text()|exsl:node-set($Match)/@type"/> Trial statement --> 
     </xsl:copy> 
    </xsl:for-each> 
    <xsl:call-template name = "Me" select="$Message"/> 
</xsl:template> 
</xsl:stylesheet> 

Und eine Eingabedatei als

<?xml version="1.0" encoding="utf-8"?> 
<msg> 
    <ent key="key1" type="error"> 
     <text>Error: Could not find </text> 
     <translation>Another Error similar to previous one.</translation> 
    </ent> 
    <ent key="key2" type="damage"> 
     <text>Error2: Could not find2 </text> 
     <translation>Another Error2 similar to previous one.</translation> 
    </ent> 
</msg> 

folge ich libxslt in Perl als meinen Transformations-Engine verwenden. Mein Transformations-Skript ist bereits in dieser answer erwähnt. Immer wenn ich das Skript ausführe, bekomme ich die Ausgabe wie folgt.

Error: Could not find 
Another Error similar to previous one. 

Error2: Could not find2 
Another Error2 similar to previous one. 

Warum ist das Attribut type nicht gedruckt zu werden? Wie kann ich es mit Hilfe von exsl:node-set oder anderen Techniken abrufen? Kann ich auch das Attribut type in die Versuchsanweisung aufnehmen, so dass es in der Ausgabe ist?

+0

, die nicht zusammen passen, gibt es keine ' Message-Knoten, auf den Ihre Vorlage überhaupt in Ihrer Eingabe passt ?! Warum versuchst du 'exsl: node-set()' hier zu verwenden, kann wahrscheinlich nicht bestimmt werden, ohne passende xsl und Eingabe-XML zu sehen –

+0

Ich bin mir nicht sicher, was du sagst. Das Skript läuft gut und die Vorlage wird aufgerufen und die Ausgabe wird angezeigt. Ich weiß nicht, wie man ein minimales, reproduzierbares und praktikables Beispiel mit Ausnahme von diesem postet. – Recker

+0

Es kann eine Standardvorlage sein, die die Ausgabe erzeugt. Wie können Sie erwarten, dass eine Vorlage, die mit "Message" übereinstimmt, aufgerufen wird, wenn in der Eingabe kein Element mit der Bezeichnung Message vorhanden ist? - Ihr minimales Beispiel mag minimal sein, aber es ist nicht mehr korrekt und könnte Ihrem wirklichen Problem nicht helfen. –

Antwort

2

Das folgende Stylesheet:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/msg"> 
    <xsl:for-each select="ent"> 
     <xsl:text>KEY: </xsl:text> 
     <xsl:value-of select="@key"/> 
     <xsl:text>&#10;TYPE: </xsl:text> 
     <xsl:value-of select="@type"/> 
     <xsl:text>&#10;TEXT: </xsl:text> 
     <xsl:value-of select="text"/> 
     <xsl:text>&#10;TRANSLATION: </xsl:text> 
     <xsl:value-of select="translation"/> 
     <xsl:text>&#10;&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

wenn auf Ihre Eingabe Beispiel angewendet wird, produzieren:

KEY: key1 
TYPE: error 
TEXT: Error: Could not find 
TRANSLATION: Another Error similar to previous one. 

KEY: key2 
TYPE: damage 
TEXT: Error2: Could not find2 
TRANSLATION: Another Error2 similar to previous one. 
Verwandte Themen