2009-07-08 65 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加载源文档或参数。