Xml 计数当前值存在的次数
输入:Xml 计数当前值存在的次数,xml,xslt,xpath,count,Xml,Xslt,Xpath,Count,输入: <PackageInfo> <outerinfo> <myCompareInfo>12345</myCompareInfo> </outerInfo> <outerinfo> <myCompareInfo>67890</myCompareInfo> <containedInfo>12345</contai
<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值存在,则应拆分状态,否则状态为avail。我为current和count创建了变量,如果count>0,我将状态设置为1,这似乎比需要的步骤多,更重要的是,2,它不起作用
<xsl:variable name="currentVal" select="./myCompareInfo/text()" />
<xsl:variable name="splitCount" select="/count(OutputInfo[contains(@myCompareInfo,$currentSSCC)])" />
计数有什么问题吗?此转换:
应用于已更正为格式良好的XML文档时:
生成所需的正确结果:
二,。XSLT 2.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>
<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>
<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>