2013-03-24 15 views
1

輸入:計數存在

<PackageInfo> 
    <outerinfo> 
     <myCompareInfo>12345</myCompareInfo> 
    </outerInfo> 
    <outerinfo> 
     <myCompareInfo>67890</myCompareInfo> 
     <containedInfo>12345</containedInfo> 
    </outerInfo> 
    <outerinfo> 
     <myCompareInfo>55667</myCompareInfo> 
     <containedInfo>12345-C</containedInfo> 
    </outerInfo> 
</PackageInfo> 

輸出:

<OutputInfo> 
    <Package> 
     <PnNum>12345</PnNum> 
     <Status>split</Status> 
    </Package> 
    <Package> 
     <PnNum>67890</PnNum> 
     <Status>avail</Status> 
    </Package> 
    <Package> 
     <PnNum>55667</PnNum> 
     <Status>avail</Status> 
    </Package>   
</OutputInfo> 

我需要做一個計數,但我不能找出正確的語法。如果當前的myCompareInfo作爲containedInfo值存在,那麼狀態應該被拆分,否則狀態是有效的。我爲current和count創建了變量,如果count> 0,我將狀態設置爲1,這看起來像是比需要更多的步驟,更重要的是,2,它不起作用。

<xsl:variable name="currentVal" select="./myCompareInfo/text()" /> 
<xsl:variable name="splitCount" select="/count(OutputInfo[contains(@myCompareInfo,$currentSSCC)])" /> 

我在做什麼錯了?

回答

0

該轉化

<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:key name="kContained" match="myCompareInfo" 
     use="boolean(/*/*/containedInfo[contains(., current())])"/> 

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

    <xsl:template match="outerInfo"> 
     <Package><xsl:apply-templates/></Package> 
    </xsl:template> 

    <xsl:template match="myCompareInfo"> 
     <PnNum><xsl:apply-templates/></PnNum> 
     <Status>available</Status> 
    </xsl:template> 

    <xsl:template match= 
    "myCompareInfo 
       [count(.|key('kContained', 'true')) 
       = 
       count(key('kContained', 'true')) 
       ]"> 
     <PnNum><xsl:apply-templates/></PnNum> 
     <Status>split</Status> 
    </xsl:template> 
    <xsl:template match="containedInfo"/> 
</xsl:stylesheet> 

當對(校正被公形成)提供的XML文檔應用:

<PackageInfo> 
    <outerInfo> 
     <myCompareInfo>12345</myCompareInfo> 
    </outerInfo> 
    <outerInfo> 
     <myCompareInfo>67890</myCompareInfo> 
     <containedInfo>12345</containedInfo> 
    </outerInfo> 
    <outerInfo> 
     <myCompareInfo>55667</myCompareInfo> 
     <containedInfo>12345-C</containedInfo> 
    </outerInfo> 
</PackageInfo> 

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

<OutputInfo> 
    <Package> 
     <PnNum>12345</PnNum> 
     <Status>split</Status> 
    </Package> 
    <Package> 
     <PnNum>67890</PnNum> 
     <Status>available</Status> 
    </Package> 
    <Package> 
     <PnNum>55667</PnNum> 
     <Status>available</Status> 
    </Package> 
</OutputInfo> 

二, XSLT 2.0解決方案

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

<xsl:key name="kContained" match="myCompareInfo" 
    use="boolean(/*/*/containedInfo[contains(., current())])"/> 

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

<xsl:template match="myCompareInfo"> 
    <PnNum><xsl:apply-templates/></PnNum> 
    <Status>available</Status> 
</xsl:template> 

<xsl:template match= 
"myCompareInfo[. intersect key('kContained', true())]"> 
    <PnNum><xsl:apply-templates/></PnNum> 
    <Status>split</Status> 
</xsl:template> 

<xsl:template match="outerInfo"> 
    <Package><xsl:apply-templates/></Package> 
</xsl:template> 
<xsl:template match="containedInfo"/> 
</xsl:stylesheet>