2016-06-27 12 views
0

私が持っているxmlファイル比較XSL出力

<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> 

そして、私は最初、XSLは、2つのリストを作成し使用している実行する必要がありますように - !IDを持っている「dlentry」要素の値を=」 books.xml "、次にid =" books.xml "となります。そして、私はそのリストを比較して、一致していないすべての要素で注意メッセージを伝えなければなりません。 "!!!!!注意MISSING 華麗なるギャツビー MISSING":

<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> 
<../>   

そして、それは出力が得られます。

何かよう

は、今私は、XSLを持って

<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> 
     </..> 

私は何百もの組み合わせを試しましたnsですが、それは動作しません..今、それは "!MISSING!" "id = books"というリストになっていますが、空の要素だけを返します 私の間違いはどこですか?

+0

を使用することができ、あなたは、少なくとも使用XSLT 2.0を想定して、あなたは最小限のが、整形式のXML入力サンプルを投稿することができますか? 「 Harry Potter Part 1 」のようなマークアップがうまく構成されていない場合、比較したいことを理解することは難しいと思います。また、 'msgph!= $ inBooks'を使いたいと思います。 –

+0

私はxslを変更しました。現在、私が扱っていることを説明するための最小限の情報が含まれています – Angela

+0

そしてフィードバックに感謝します!私はどのように 'msgph!= $ inBooks'を使うことができるのか理解できません。私はxslで経験はありませんが、同じ場所にない 'msgph'として可能です。 – Angela

答えて

0

私は、あなたが

<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

ありがとう!コンパクトでエレガント!それは完全に動作します:) – Angela

関連する問題