2012-11-09 21 views
1

我是XSLT的初學者。 我的源XML:XSLT如何使用數組篩選數據

<Request> 
    <Documents> 
     <Doc Type="A">123</Doc> 
     <Doc Type="C">345</Doc> 
    </Documents> 
</Request> 

我的回答是XML:

<Response> 
    <RequestedDoc> 
     <Doc Type="A">123</Doc> 
     <Doc Type="C">345</Doc> 
    </RequestedDoc> 
    <Result> 
     <Document> 
     <Id>A123</Id> 
     <Name>Doc1</Name> 
     </Document> 
     <Document> 
     <Id>E143</Id> 
     <Name>Doc2</Name> 
     </Document> 
     <Document> 
     <Id>C345</Id> 
     <Name>Doc3</Name> 
     </Document> 
     <Document> 
     <Id>D153</Id> 
     <Name>Doc4</Name> 
     </Document> 
    </Result> 
</Response> 

,我需要使用RequestedDoc標籤過濾Result標籤。 我已經嘗試過下面的XSLT,但它只返回第一個結果。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:variable name="requestedDoc" select="//RequestedDoc/Doc"/> 

    <xsl:template match="Response"> 
     <xsl:element name="FilterResult"> 
      <xsl:apply-templates select="//Result/Document[contains(Id,$requestedDoc)]"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="Document"> 
     <xsl:element name="Name"> 
     <xsl:value-of select="Name"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

但是這個XSLT總是返回第一個數據Doc A123

<FilterResult> 
    <Name>Doc1</Name> 
</FilterResult> 

預期的結果是

<FilterResult> 
    <Name>Doc1</Name> 
    <Name>Doc3</Name> 
</FilterResult> 

請幫助。

+0

請。 *編輯*問題,並指定轉換的確切想要的結果 - 以便我們不需要猜測。 –

+0

@DimitreNovatchev完成:) –

+0

Ankur Ra​​iyani,我發佈了一個答案。 –

回答

1

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/*"> 
    <FilterResult> 
     <xsl:apply-templates/> 
    </FilterResult> 
</xsl:template> 

<xsl:template match="Document[substring(Id,2) = /*/RequestedDoc/*]"> 
    <xsl:copy-of select="Name"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

當所提供的響應文件施加:

<Response> 
    <RequestedDoc> 
     <Doc Type="A">123</Doc> 
     <Doc Type="C">345</Doc> 
    </RequestedDoc> 
    <Result> 
     <Document> 
     <Id>A123</Id> 
     <Name>Doc1</Name> 
     </Document> 
     <Document> 
     <Id>E143</Id> 
     <Name>Doc2</Name> 
     </Document> 
     <Document> 
     <Id>C345</Id> 
     <Name>Doc3</Name> 
     </Document> 
     <Document> 
     <Id>D153</Id> 
     <Name>Doc4</Name> 
     </Document> 
    </Result> 
</Response> 

產生想要的,正確的結果:

<FilterResult> 
    <Name>Doc1</Name> 
    <Name>Doc3</Name> 
</FilterResult> 
+0

謝謝!解決問題:) –

+0

@AnkurRaiyani,不客氣。 –