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値として存在する場合、ステータスを分割する必要があります。そうでない場合、ステータスはavailです。currentとcountの変数を作成し、count> 0の場合はステータスを設定しましたが、1は必要以上のステップのようで、さらに重要なことに2は機能していません。

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

カウントで何が間違っているのですか?

4

1 に答える 1

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>
于 2013-03-24T03:38:53.047 に答える