2016-05-09 8 views
-1

Ich habe begonnen, XSLT LernenXML zu XML-Transformation mit verschiedenem Innerem Knoten aber mit dem gleichen Knoten äußeren XSLT mit

Wenn an dem ich arbeite, dass ich eine falsche Art von XML-Format Eingang

<?xml version="1.0" encoding="ISO-8859-1"?> 
<root> 
    <test> 
    <access1>113AL</access1> 
    <access2>119AL</access2> 
    </test> 
    <test> 
    <access2>115AL</access2> 
    <access3>116AL</access3> 
    </test> 
    <test> 
    <access4>118AL</access4> 
    <access5>119AL</access5> 
    </test> 
    <copies> 
    <test2> 
     <a>113AL</a> 
     <Copy1>Y</Copy1> 
    </test2> 
    <test2> 
     <a>113AX</a> 
     <Copy1>N</Copy1> 
    </test2> 
    </copies> 
</root> 
bekomme

Erwarteter Ausgang

<?xml version="1.0" encoding="ISO-8859-1"?> 
<root> 
    <test> 
    <access1>113AL</access1> 
    <Indicator>true</Indicator> 
    <Copy>Y</Copy> 
    <access2>119AL</access2> 
    </test> 
    <test> 
    <access2>115AL</access2> 
    <access3>116AL</access3> 
    </test> 
    <test> 
    <access4>118AL</access4> 
    <access5>119AL</access5> 
    </test> 
</root> 

Ich versuche root/test/access-Werte mit root/test/access zu vergleichen. Wenn eine Übereinstimmung gefunden wird, sollte sie das entsprechende Copy-Tag enthalten. Mein XSL

<?xml version="1.0" encoding="ISO-8859-1"?> 
<root> 
<xsl:for-each select="test"> 
<test> 
<access1><xsl:value-of select="//access1"/></access1> 
<access2><xsl:value-of select="//access2"/></access2> 
<xsl:for-each select="root/copies/test2/access"> 
<xsl:if test ="access1=test2/access"> 
<Copy>Y</Copy> 
</xsl:if> 
</xsl:for-each> 
</test> 
</xsl:for-each> 
<xsl:for-each select="test"> 
<test> 
<access2><xsl:value-of select="//access2"/></access2> 
<access3><xsl:value-of select="//access3"/></access3> 
<xsl:for-each select="root/copies/test2/access"> 
<xsl:if test ="access1=test2/access"> 
<Copy>Y</Copy> 
</xsl:if> 
</xsl:for-each> 
</test> 
</xsl:for-each> 
<xsl:for-each select="test"> 
<test> 
<access4><xsl:value-of select="//access4"/></access4> 
<access5><xsl:value-of select="//access5"/></access5> 
<xsl:for-each select="root/copies/test2/access"> 
<xsl:if test ="access1=test2/access"> 
<Copy>Y</Copy> 
</xsl:if> 
</xsl:for-each> 
</test> 
</xsl:for-each> 
</root> 

Das gibt mir falsch ausgegeben. Kann mir jemand hier helfen, wo ich einen Fehler mache und bitte hilf mir, wie es in XSLT 1.0 funktioniert?

+1

Ist der markierte Abschnitt „Output“, was Sie _will_, um ernsthaft, oder ist es die falsche Ausgabe Ihrer momentan sehen? Wenn es sich um die falsche Ausgabe handelt, geben Sie bitte die erwartete Ausgabe an. –

+0

Abschnitt beschriftet Ausgabe ist die erwartete Ausgabe. – user6309006

+0

Es gibt nicht genügend Informationen zu beantworten. Woher kamen 'access6' und' access8'? Welche Regel führte dazu, dass "access8" diesen Text enthielt? –

Antwort

0

Diese ganze Frage ist ein wenig verwirrend.
Der Eingang xml ist noch nicht valide: Ich habe dieses feste Version verwenden:

<?xml version="1.0" encoding="UTF-8"?> 
    <root> 
     <test> 
      <access1>113AL</access1> 
      <access2>119AL</access2> 
     </test> 
     <test> 
      <access2>115AL</access2> 
      <access3>116AL</access3> 
     </test> 
     <test> 
      <access4>118AL</access4> 
      <access5>119AL</access5> 
     </test> 
     <copies> 
      <test2> 
       <access>113AL</access> 
       <Copy>Y</Copy> 
      </test2> 
      <test2> 
       <access>113AX</access> 
       <Copy>N</Copy> 
      </test2> 
      </copies> 
    </root> 

Auch

I am trying to compare root/test/access values with root/test/access . If a match is found, it should include the corresponding Copy tag.

Es scheint, dies sollte root/Test/Zugriffswerte mit root/Kopien vergleichen werden/test2/Zugang

Daher können Sie versuchen:

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

    <xsl:output method="xml" indent="yes" /> 

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

    <xsl:template match="test"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
      <xsl:variable name="thisaccess" select="*[starts-with(name(), 'access')]" /> 
      <xsl:apply-templates select="//copies/test2[access=$thisaccess]/Copy" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="copies"/> 

</xsl:stylesheet> 

Mit der folgenden Ausgabe:

 <root> 
      <test> 
       <access1>113AL</access1> 
       <access2>119AL</access2> 
       <Copy>Y</Copy> 
      </test> 
      <test> 
       <access2>115AL</access2> 
       <access3>116AL</access3> 
      </test> 
      <test> 
       <access4>118AL</access4> 
       <access5>119AL</access5> 
      </test> 
     </root> 

Update: Aufgrund zu kommentieren.

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

<xsl:template match="test/*[starts-with(name(), 'access')]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    <xsl:variable name="thisaccess" select="." /> 
    <xsl:apply-templates select="//copies/test2[access=$thisaccess]/Copy" /> 
</xsl:template> 

<xsl:template match="copies"/> 

Und die neue Ausgabe:

<root> 
    <test> 
     <access1>113AL</access1> 
     <Copy>Y</Copy> 
     <access2>119AL</access2> 
    </test> 
    <test> 
     <access2>115AL</access2> 
     <access3>116AL</access3> 
    </test> 
    <test> 
     <access4>118AL</access4> 
     <access5>119AL</access5> 
    </test> 
</root> 
+0

Der obige Code gibt mir den Fehler: – user6309006

+0

[Schwerwiegender Fehler] NewFile.xml: 1: 9: Das Ziel der Verarbeitungsanweisung "[xX] [mM] [lL]" ist nicht zulässig. – user6309006

+1

Hm es gibt keine Verarbeitungsanweisung in oben xml oder xslt. Nur die XML-Deklaration '

0

Ihre XSLT-Transformationsdatei sieht ziemlich komisch aus, werfen Sie einen Blick auf das Tutorial, um ein besseres Gefühl dafür zu bekommen, wie XSLT funktioniert, zB: http://www.w3schools.com/xsl/default.asp.

für Ihren Fall, schlage ich vor, Sie die folgende XSLT:

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

<xsl:template match="/"> 
    <xsl:element name="root"> 
     <xsl:apply-templates name="copyTest" /> 
    </xsl:element> 
</xsl:template> 

<xsl:template name="copyTest" match="root"> 
    <xsl:copy-of select="test"></xsl:copy-of> 
</xsl:template> 

Das kopiert die test Elemente direkt unter dem Element root aber nicht die, die unter dem Element Copies

+0

Ich habe meine erwartete Ausgabe geändert ... Könnten Sie bitte helfen ... – user6309006

+0

Ich verstehe nicht wirklich Ihre Notwendigkeit. Für Formatierungszwecke oder Massentransformationen kann XSLT relevant sein. Für exotische Zwecke wäre es sicherlich einfacher für Sie, Ihre Logik in Java zu implementieren und JaxB für die Java-Bindung zu verwenden ("Lesen und Schreiben" der XML-Elemente von/zu Java-Objekten). –

+0

Wie ich bereits sagte, ich bin neu in XSLT und experimentiere nur mit dem Code aus dem Internet ... – user6309006

Verwandte Themen