2014-10-17 16 views
0

我正在編寫xslt用於根據其中一個字段篩選數據。XSLT用於選擇對應於一個字段的第一個詳細信息

這是我輸入的xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Consumer> 
<header> 
    <msfnm>MSFNM</msfnm> 
    <mslnm>MSLNM</mslnm> 
    <msmnm>MSMNM</msmnm> 
    <msssn>MSSSN</msssn> 
    <csscstno>CSSCSTNO</csscstno> 
    <msact>MSACT</msact> 
</header> 
<data> 
    <msfnm>Nitin</msfnm> 
    <mslnm>Jain</mslnm> 
    <msmnm/> 
    <msssn>123</msssn> 
    <csscstno>111</csscstno> 
    <msact>1234</msact> 
</data> 
<data> 
    <msfnm>Nitin1</msfnm> 
    <mslnm>Jain1</mslnm> 
    <msmnm>L1</msmnm> 
    <msssn>1233</msssn> 
    <csscstno>111</csscstno> 
    <msact>1233556</msact> 
</data> 
<data> 
    <msfnm>Nitin2</msfnm> 
    <mslnm>Jain2</mslnm> 
    <msmnm>L1</msmnm> 
    <msssn>1234</msssn> 
    <csscstno>123</csscstno> 
    <msact>12334256</msact> 
</data> 
<data> 
    <msfnm>Nitin</msfnm> 
    <mslnm>Jain</mslnm> 
    <msmnm/> 
    <msssn>123</msssn> 
    <csscstno>111</csscstno> 
    <msact>1234</msact> 
</data> 

,我想我的XML輸出應該像

<?xml version="1.0" encoding="UTF-8"?> 
<Consumer> 
    <data> 
    <msfnm>Nitin</msfnm> 
    <mslnm>Jain</mslnm> 
    <msmnm/> 
    <msssn>123</msssn> 
    <csscstno>111</csscstno> 
    <msact>1234</msact> 
</data> 
    <data> 
    <msfnm>Nitin2</msfnm> 
    <mslnm>Jain2</mslnm> 
    <msmnm>L1</msmnm> 
    <msssn>1234</msssn> 
    <csscstno>123</csscstno> 
    <msact>12334256</msact> 
</data> 

</Consumer> 

條件:我想基本上是什麼,採取csscstno的第一次出現只要。如果在下一次出現時,csscstno是相同的,那麼整個集合應該被拒絕。

我的XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xml> 
     <xsl:for-each select="/Consumer/data"> 

      <Consumer> 
       <msfnm><xsl:value-of select="msfnm"/></msfnm> 
       <mslnm><xsl:value-of select="mslnm"/></mslnm> 
       <msmnm><xsl:value-of select="msmnm"/></msmnm> 
       <msssn><xsl:value-of select="msssn"/></msssn> 
<xsl:if test="position()=1"> 
       <csscstno><xsl:value-of select="csscstno"/></csscstno> 
    </xsl:if> 
       <msact><xsl:value-of select="msact"/></msact> 
      </Consumer> 

    </xsl:for-each> 
    </xml> 
</xsl:template> 
</xsl:stylesheet> 

這是行不通的。讓我知道,我在這裏做錯了什麼。

回答

0

或者,您可以使用密鑰按csscstno分組數據以獲得第一次出現。另外,您可以使用副本選擇「數據」:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:key name="dataByCsscstno" match = "data" use = "csscstno"/> 
<xsl:template match="/"> 
    <Consumer> 
     <xsl:copy-of select="/Consumer/data[generate-id() = generate-id(key('dataByCsscstno', csscstno)[1])]"/> 
    </Consumer> 
</xsl:template> 
</xsl:stylesheet> 
0

您可以使用密鑰。就像下面的樣式表:

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes" /> 

    <!-- create a key for your target node --> 
    <xsl:key name="Customer_No" match="csscstno" use="."/> 

    <!-- copy only the 1st matched keys in the output --> 
    <xsl:template match="/"> 
     <Consumer> 
      <xsl:copy-of select="Consumer/data[count(csscstno | key('Customer_No', csscstno)[1]) = 1]"/> 
      <!-- or you can use the following line instead 
      <xsl:copy-of select="Consumer/data[generate-id(csscstno) = generate-id(key('Customer_No', csscstno)[1])]"/> 
      --> 
     </Consumer> 
    </xsl:template> 

</xsl:transform> 
時,這是適用於您的輸入XML

,結果是:

<?xml version="1.0" encoding="utf-8"?> 
<Consumer> 
    <data> 
     <msfnm>Nitin</msfnm> 
     <mslnm>Jain</mslnm> 
     <msmnm/> 
     <msssn>123</msssn> 
     <csscstno>111</csscstno> 
     <msact>1234</msact> 
    </data> 
    <data> 
     <msfnm>Nitin2</msfnm> 
     <mslnm>Jain2</mslnm> 
     <msmnm>L1</msmnm> 
     <msssn>1234</msssn> 
     <csscstno>123</csscstno> 
     <msact>12334256</msact> 
    </data> 
</Consumer> 
0

最終我發現另一種方式,這是按預期工作。

這裏是我的XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
<xml> 
    <xsl:for-each-group select="/Consumer/data" group-by="csscstno"> 
     <xsl:copy-of select="current-group()[1]"/> 
    </xsl:for-each-group>    
</xml> 
</xsl:template> 
</xsl:stylesheet> 
+0

這是一個好方法 - ** **如果你正在使用XSLT 2.0。在這種情況下,你的樣式表應該說'version =「2.0」'。由於你原來的問題顯示了一個'version =「1.0」'的樣式表,你已經提供了XSLT 1.0解決方案 - 即Muenchian分組。這就是爲什麼除了通用的XSLT標籤之外,最好用恰當的XSLT版本標記問題。 – 2014-10-17 17:29:50

相關問題