2017-01-29 5 views
0

Ich habe eine Eingabe-XML-Datei, die ein Element enthält, das wiederum xml-Text enthält. Ich möchte den Elementtext lesen und dann in einen Knotensatz verwandeln, damit ich mit xpath nach einer Sache suchen kann. Dies ist das Stück:xalan: nodeset rendern keinen Knoten aber nur Text

<TEMPLATE_STRUCTURE_XML><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<TRANSACTION> 
<VERSION>1.3</VERSION> 
<SCREEN>something123</SCREEN> 
</TRANSACTION> 
]]></TEMPLATE_STRUCTURE_XML> 

In diesem Fall habe ich den Wert something123 erhalten möchten.

Das Problem ist, dass, wenn ich (hard) lege den Abschnitt der inneren XML-Datei in dem xsl, xalan: nodeset() gut funktioniert, aber es funktioniert nicht, wenn ich xsl: value-of . oXygen XMLeditor zeigt mir, dass das Ergebnis von value-of zu einem reinen Text geworden ist, nicht zu einem Knoten.

Die folgenden Werke:

<xsl:variable name="statementSummaryData"> 
     <ss_Set> 
      <TRANSACTION> 
       <VERSION>1.3</VERSION> 
       <SCREEN>something123 
       </SCREEN> 
      </TRANSACTION> 
     </ss_Set> 
    </xsl:variable> 
    <xsl:variable xmlns:xalan="http://xml.apache.org/xalan" name="ssTemplatesNodeSet" select="xalan:nodeset($statementSummaryData)"/> 
    <xsl:value-of select="substring-before($ssTemplatesNodeSet//SCREEN,' ')"/> 

Die folgende funktioniert nicht. Die <ss_Set> Element wird zu einem Knoten, aber die Ausgabe des Wert-of wird Klartext innerhalb <ss_Set>:

<xsl:variable name="statementSummaryWithHeader"> 
      <xsl:value-of select="TEMPLATE_STRUCTURE_XML" disable-output-escaping="yes"/> 
    </xsl:variable> 
    <xsl:variable name="statementSummaryWithNoHeader"> 
    <xsl:value-of select="substring-after($statementSummaryWithHeader,'?>')" disable-output-escaping="yes"/> 
    </xsl:variable> 
<xsl:variable name="statementSummaryData"> 
    <ss_Set> 
    <xsl:value-of select="$statementSummaryWithNoHeader" disable-output-escaping="yes"/> 
    </ss_Set> 
</xsl:variable> 
<xsl:variable xmlns:xalan="http://xml.apache.org/xalan" name="ssTemplatesNodeSet" select="xalan:nodeset($statementSummaryData)"/> 
<xsl:value-of select="substring-before($ssTemplatesNodeSet//SCREEN,' ')"/> 

Die folgenden nicht funktioniert entweder:

<xsl:variable name="statementSummaryWithHeader"> 
      <xsl:value-of select="TEMPLATE_STRUCTURE_XML" disable-output-escaping="yes"/> 
    </xsl:variable> 
    <xsl:variable name="statementSummaryWithNoHeader"> 
    <xsl:value-of select="substring-after($statementSummaryWithHeader,'?>')" disable-output-escaping="yes"/> 
    </xsl:variable> 
    <xsl:variable name="statementSummaryData"> 
     <ss_Set> 
      <xsl:value-of xmlns:xalan="http://xml.apache.org/xalan" select="xalan:nodeset($statementSummaryWithNoHeader)"/> 
     </ss_Set> 
    </xsl:variable> 
    <xsl:variable xmlns:xalan="http://xml.apache.org/xalan" name="ssTemplatesNodeSet" select="xalan:nodeset($statementSummaryData)"/> 
    <xsl:value-of select="substring-before($ssTemplatesNodeSet//SCREEN,' ')"/> 

Antwort

0

Du Misch Äpfel und Orangen. Die node-set()-Funktion kann ein Ergebnis-Baum-Fragment nehmen und es in einen Knotensatz konvertieren. Es kann nicht CDATA in parsable Markup drehen.

Um zu erfahren, was Sie tun können, um die Zeichenfolge, die Sie extrahieren möchten, finden Sie unter:
https://stackoverflow.com/a/37777846/3016153

+0

Ich glaube, es gibt einige Implementierungen von node-set(), die, wenn eine Zeichenfolge angegeben, ein Parse tun -xml() darauf - aber ich weiß nicht, ob die Xalan-Implementierung einer von denen ist. –

+0

@MichaelKay Ich glaube, wir hatten diese Unterhaltung schon einmal. Ich bin mir keiner 'node-set()' Implementierung bewusst, die das tun wird. Ich weiß sicher, dass Xalan nicht will: http://xsltransform.net/bFWR5EF –

+0

Ok, ich habe es verstanden. Also werde ich substring-before und sub-string danach verwenden, um die Ausgabe dieses bestimmten inneren Elements zu erhalten; Ich sehe jedoch eine andere Möglichkeit, dies zu tun, indem ich den Baum dynamisch erstelle, indem ich Knoten mit erzeuge. Für weitere Informationen gehen Sie hier (Danke Michael für Ihre Hilfe): http: //stackoverflow.com/questions/5418493/create-nodes-from-string-variable –