Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 计数当前值存在的次数_Xml_Xslt_Xpath_Count - Fatal编程技术网

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>