2016-09-02 4 views
0

ich die folgende Struktur mit XSL erstellen möchten:Xsl, Xpath Die folgenden Geschwister foreach

<div class="helloclass">C 
<div class="hellomethod"><p>test</p></div> 
<div class="hellomethod"><p>test</p></div> 
</div> 
<div class="helloclass"> 
</div> 

ich folgende XML haben:

<?xml version="1.0"?> 
    <hello id="C"></hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="C"></hello> 
</xml> 

Mit XSL und XPath Ich habe versucht, die folgenden:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org"> 
    <xsl:template match="/"> 
    <xsl:for-each select="hello"> 
     <xsl:if test="current()[contains(@id,'C')]"> 
     <xsl:for-each select="following-sibling"> 
      <xsl:if test="current()[[email protected],'M']"> 
      <p>Test</p> 
      </xsl:if> 
     </xsl:for-each> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:styleshet> 

Ich habe eine flache xml-Struktur. Für dieses XML möchte ich basierend auf der ID eine Struktur erstellen.

id = "C" bedeutet, dass es zu < div class = "helloclass" > id = "M" umgewandelt werden sollte, bedeutet, dass es zu < div class = "Hello" >

umgewandelt werden sollte My Das erste Ziel ist es, den Text "test" in den richtigen Knoten zu zeigen.

Auch M sollte in C geschachtelt werden und nicht ein Geschwister wie in der XML sein. Die folgenden Sequenzen können auch erscheinen: CMMCCMMMC, oder CCCCCCCCCCMM, OR CM, ... Grundsätzlich brauche ich eine "generische" Lösung.

XLST 1.0 Prozessor nur verfügbar.

+2

Bitte erläutern Sie die Logik ** in Worten **. - Beachten Sie auch, dass die Eingabe kein wohlgeformtes XML ist (hat kein Wurzelelement), das das Schreiben der XSLT erschwert, da der Kontext unbekannt ist. –

+0

Ich versuchte mein Problem zu erklären. Grundsätzlich habe ich Probleme mit einer flachen "xml" -Struktur. –

+0

Kann es zwei oder mehr Sequenzen geben, z.B. CMMCCMMMC in der gleichen Eingabe? –

Antwort

0

Während dies in XSLT 2.0 eine triviale Aufgabe ist, ist es bei weitem nicht trivial, wenn es von einem XSLT 1.0-Prozessor ausgeführt werden soll.

Beachten Sie Folgendes:

XML

<root> 
    <hello id="C">A</hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="C">B</hello> 
    <hello id="C">C</hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="M"></hello> 
    <hello id="C">D</hello> 
    <hello id="C">E</hello> 
</root> 

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" encoding="UTF-8" indent="yes"/> 

<xsl:key name="method" match="hello[@id='M']" use="generate-id(preceding-sibling::hello[@id='C'][1])" /> 

<xsl:template match="/root"> 
    <body> 
     <xsl:for-each select="hello[@id='C']"> 
      <div class="helloclass"> 
       <xsl:value-of select="."/> 
       <xsl:for-each select="key('method', generate-id())"> 
        <div class="hellomethod"> 
         <p>test</p> 
        </div> 
       </xsl:for-each> 
      </div> 
     </xsl:for-each> 
    </body> 
</xsl:template> 

</xsl:stylesheet> 

Ergebnis

<body> 
    <div class="helloclass">A 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
    </div> 
    <div class="helloclass">B</div> 
    <div class="helloclass">C 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
     <div class="hellomethod"> 
     <p>test</p> 
     </div> 
    </div> 
    <div class="helloclass">D</div> 
    <div class="helloclass">E</div> 
</body> 
+0

Vielen Dank für diese Antwort. Haben Sie irgendwelche Ressourcen, wo ich das lernen kann, wenn ich ein anderes kompliziertes Problem habe, kann ich es selbst lösen? –

+0

Ich fürchte, ich bin nicht die richtige Person, um das zu beantworten. –

Verwandte Themen