2016-06-27 13 views
0

Ich habe XML-Datei wieVergleich xsl Ausgang

<section> 
<dlentry xtrf="books.xml"> 
<dd> 
<msgph>Harry Potter 
</msgph> 
</dd> 
</dlentry> 

<dlentry xtrf="books.xml"> 
<dd> 
<msgph>1984 
</msgph> 
</dd> 
</dlentry> 

<dlentry xtrf="books.xml"> 
<dd> 
<msgph>The Great Gatsby 
</msgph> 
</dt> 
</dlentry> 

<dlentry> 
<dd> 
<dl> 
<dlentry xtrf="myFavouriteBooks.xml"> 
<dd> 
<parml> 
<plentry> 
<pd> 
<msgph>Harry Potter 
</msgph> 
</pd>  
</plentry> 
</parml> 
</dd> 
</dlentry> 
</dl> 
</dd>   
</dlentry> 

<dlentry xtrf="myBooks.xml"> 
<dd> 
<msgph>1984 
</msgph> 
</dd> 
</dlentry> 

</section> 

Und was ich tun muß, ist mit 2 Listen XSL erstellen, zuerst - mit Werten von „dlentry“ Elemente, das eine id hat =“ books.xml " und zweitens - mit id =" books.xml ". Und nachdem ich diese Listen vergleichen und die Aufmerksamkeitsnachricht mit allen nicht übereinstimmenden Elementen geben sollte. "!!!! Achtung FEHLT FEHLT The Great Gatsby"

So etwas wie

Jetzt habe ich xsl:

<xsl:variable name="inBooks" select="/dlentry/dd/msgph"/>  
<xsl:variable name="notInBooks" select="//dlentry[not(contains(@xtrf,'books.xml))]//msgph/node()[not(self::dlentry)])" as="item()*"/> 

<title>Books</title> 

<refbody> 
    <section> 
     <dl>        
     <dlentry>     
     <xsl:variable name="notMatched" select="//dlentry[not(contains(@xtrf,'books.xml'))]//msgph[msgph !='$inBooks']/node()[not(self::dlentry)])"/> 

      <xsl:choose> 
       <xsl:when test="$notMatched"> 
        <xsl:for-each select="section/dl/dlentry"> 
        <dt> 
         <xsl:value-of select="concat('!MISSING! ', msgph")/> 
        </dt> 
        </xsl:for-each> 
       </xsl:when> 
       <xsl:otherwise> 
       <xsl:for-each select="section/dl/dlentry"> 
        <dt> 
         <xsl:value-of select="msgph"/> 
        </dt> 
       </xsl:for-each> 

       </xsl:otherwise> 
      </xsl:choose> 

     <dt>        
      <xsl:value-of select="$notInBooks"/> 
     </dt> 
<../>   

Und es gibt die Ausgabe:

<title>Books</title> 

<refbody> 
    <section> 
    <dl> 
     <dlentry> 

      <dt>The Great Gatsby</dt> 
      <dt>1984</dt> 
      <dt>Harry Potter Part 2</dt> 
      <dt>Harry Potter Part 1</dt> 
      <dd/> 
      <dt>Harry Potter Part 1 Harry Potter Part 2</dt> 
     </..> 

Ich habe Hunderte von Kombinationen probiert ns, aber es funktioniert nicht .. Jetzt sollte es hinzufügen "! MISSING!" zu einer Liste "id = Bücher", aber es gibt nur ein leeres Element Kannst du mich zeigen, wo ist mein Fehler, bitte?

+0

Können Sie eine minimale, aber wohlgeformte XML-Eingangsabtastwert posten? Ich fürchte, es ist schwer zu verstehen, was Sie vergleichen möchten, wenn das Markup wie ' Harry Potter Teil 1 ' nicht gut gebildet ist. Ich denke auch, dass Sie 'msgph! = $ InBooks' verwenden möchten. –

+0

Ich habe die xsl geändert, jetzt enthält es die minimale Info zu erklären, was ich damit zu tun habe – Angela

+0

Und danke für die Rückmeldung! I Aber ich verstehe nicht, wie ich 'msgph! = $ InBooks' verwenden kann .. Ich bin nicht mit xsl erfahren, aber es scheint nicht möglich .. als 'msgph' nicht an der gleichen Stelle – Angela

Antwort

0

Ich nehme an, Sie können zumindest Verwendung XSLT 2.0, dann können Sie verwenden

<xsl:variable name="b1" select="//dlentry[contains(@xtrf, 'books.xml')]"/> 
<xsl:variable name="b2" select="//dlentry[not(contains(@xtrf, 'books.xml'))]"/> 

<xsl:variable name="b3" select="$b1[not(.//msgph/normalize-space() = $b2//msgph/normalize-space())]"/> 
+0

Vielen Dank! So kompakt und elegant! Und es funktioniert perfekt :) – Angela