2009-07-08 56 views
0

這裏是我的輸入XML:如何通過使用XML的XSLT過濾器的XML PARAMS

<Books> 
    <Book> 
    <BookId>1</BookId> 
    <Des>Dumm1</Des> 
    <Comments/> 
    <OrderDateTime>04/06/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>2</BookId> 
    <Des>Dummy2</Des> 
    <Comments/> 
    <OrderDateTime>04/07/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>3</BookId> 
    <Des>Dumm12</Des> 
    <Comments/> 
    <OrderDateTime>05/06/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>4</BookId> 
    <Des>Dummy2</Des> 
    <Comments/> 
    <OrderDateTime>06/07/2009 12:37</OrderDateTime> 
    </Book> 
</Books> 

我傳遞一個XML PARAM和我的輸入XML是

<BookIDs> 
    <BookID>2</BookID> 
    <BookID>3</BookID> 
</BookIDs> 

我的輸出應該是這樣的

<Books> 
    <Book> 
    <BookId>2</BookId> 
    <Des>Dummy2</Des> 
    <Comments/> 
    <OrderDateTime>04/07/2009 12:37</OrderDateTime> 
    </Book> 
    <Book> 
    <BookId>3</BookId> 
    <Des>Dumm12</Des> 
    <Comments/> 
    <OrderDateTime>05/06/2009 12:37</OrderDateTime> 
    </Book> 
</Books> 

如何使用XSLT完成此操作?

+0

您能先發布您的嘗試嗎? – 2009-07-08 18:17:24

回答

0

這工作撒克遜6.5.5 ...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> 
    <xsl:param name="nodeset"> 
     <BookIDs><BookID>2</BookID><BookID>3</BookID></BookIDs> 
    </xsl:param> 

    <xsl:template match="/Books"> 
     <Books> 
      <xsl:variable name="Copy"> 
       <wrap> 
        <xsl:copy-of select="Book"/> 
       </wrap> 
      </xsl:variable> 
      <xsl:for-each select="$nodeset/BookIDs/BookID"> 
       <xsl:copy-of select="$Copy/wrap/Book[BookId=current()]"/> 
      </xsl:for-each> 
     </Books> 
    </xsl:template> 
</xsl:stylesheet> 

純XSLT的解決方案將是非常脆,但。子查詢謂詞不起作用,一個關鍵也沒有。它依賴於被識別爲節點集的參數 - 我無法用動態值(而不是我的例子中的默認值)實現,即使使用exsl:node-set。這也是浪費,因爲它複製源文檔中的所有書籍元素。

XSLT 2.0中可能有更好的解決方案。或者,如果您使用其他語言/工具啓動變換,那麼可能會有更好的方法。另一種可能性可能包括使用exsl:document加載源文檔或參數。