2016-10-18 8 views
0

私はXSLTを使って1つのXMLファイルを別のものに変換しようとしています。結果のXMLファイルは実行されたクエリの結果です。残念ながら、私が理解していることから、XSLTの変数は変更不能で変更できません。私は、関連する部分に対して返されたクエリの合計値を取得できるように、値を追加できる他の方法があるかどうか疑問に思っていました。XSLT変数が不変であるにもかかわらず、変数をインクリメントしようとしています

元のXMLファイルに見られるように、各エントリのすべての年齢グループ番号の合計値がカウントされます。私は$ AGE_GROUP1と$ AGE_GROUP2の照会された年齢の範囲に基づいて異なる年齢グループを抽出するためにXSLTクエリを使用しましたが、宣言された変数は不変なので、年齢グループの照会された値を加算する方法は考えられません。

以下は、ソースXMLファイルである:そう1年齢層のための、

<?xml version="1.0" encoding="UTF-8"?> 
<Replacements> 
    <Entry> 
     <Year>2005</Year> 
     <Month>DEC</Month> 
     <Reason>Blemish on Card</Reason> 
     <Age> 
     <Group> 
      <Range>Total</Range> 
      <value>16</value> 
     </Group> 
     <Group> 
      <Range>16-17</Range> 
      <value>3</value> 
     </Group> 
     <Group> 
      <Range>18-25</Range> 
      <value>12</value> 
     </Group> 
     <Group> 
      <Range>26-29</Range> 
      <value>1</value> 
     </Group> 
     </Age> 
    </Entry> 
    <Entry> 
     <Year>2005</Year> 
     <Month>DEC</Month> 
     <Reason>Damaged</Reason> 
     <Age> 
     <Group> 
      <Range>Total</Range> 
      <value>7</value> 
     </Group> 
     <Group> 
      <Range>16-17</Range> 
      <value>6</value> 
     </Group> 
     <Group> 
      <Range>18-25</Range> 
      <value>0</value> 
     </Group> 
     <Group> 
      <Range>26-29</Range> 
      <value>1</value> 
     </Group> 
     </Age> 
    </Entry> 
</Replacements> 

以下のXSLTのみを抽出し、関連する2 3の年齢群(のみ24に14歳から年齢層を抽出)元のデータセット内の各エントリには、結果のXMLファイルに出力されません。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

    <xsl:variable name = "QUERY_YEAR1" select = "2005" /> 
    <xsl:variable name = "QUERY_YEAR2" select = "2007" /> 
    <xsl:variable name = "AGE_GROUP1" select = "14" /> 
    <xsl:variable name = "AGE_GROUP2" select = "24" /> 
    <xsl:variable name = "TOTAL" select = "0" /> 

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

    <xsl:template match="/"> 

     <xsl:for-each select="Replacements/Entry"> 
      <xsl:if test="$QUERY_YEAR1 &lt;= Year/text() and $QUERY_YEAR2 &gt;= Year/text()"> 
       <Entry> 
        <Year> 
         <xsl:value-of select="Year/text()" /> 
        </Year> 
        <Month> 
         <xsl:value-of select="Month/text()" /> 
        </Month> 
        <Reason> 
         <xsl:value-of select="Reason/text()" /> 
        </Reason> 
        <xsl:for-each select="Age/Group"> 

         <!-- $AGE_GROUP1 < 16 & 17, $AGE_GROUP2 > 16 & 17 for age group 16-17 (e.g. $AGE_GROUP1 = 14 & $AGE_GROUP2 = 30 --> 
         <xsl:if test="$AGE_GROUP1 &lt;= number(substring(Range/text(), 1, 2)) and $AGE_GROUP1 &lt;= number(substring(Range/text(), 4, 2)) and $AGE_GROUP2 &gt;= number(substring(Range/text(), 1, 2)) and $AGE_GROUP2 &gt;= number(substring(Range/text(), 4, 2)) and not(Range/text() = 'Total') and not(Range/text() = '80+')"> 

          <!-- Add to $TOTAL value --> 
          <xsl:variable name = "TOTAL" select = "number($TOTAL) + number(value/text())" /> 

          <AgeGroup> 
           <Range> 
            <xsl:value-of select="Range/text()" /> 
           </Range> 
           <value> 
            <xsl:value-of select="value/text()" /> 
           </value> 
          </AgeGroup> 
         </xsl:if> 

         <!-- $AGE_GROUP1 < 30 & 39, $AGE_GROUP2 = 30 & < 39 for age group 30-39 (e.g. $AGE_GROUP1 = 14 & $AGE_GROUP2 = 30 --> 
         <!-- $AGE_GROUP1 < 26 & 29, $AGE_GROUP2 > 26 & < 29 for age group 26-29 (e.g. $AGE_GROUP1 = 19 & $AGE_GROUP2 = 27 --> 
         <xsl:if test="$AGE_GROUP1 &lt;= number(substring(Range/text(), 1, 2)) and $AGE_GROUP1 &lt;= number(substring(Range/text(), 4, 2)) and $AGE_GROUP2 &gt;= number(substring(Range/text(), 1, 2)) and $AGE_GROUP2 &lt;= number(substring(Range/text(), 4, 2)) and not(Range/text() = 'Total') and not(Range/text() = '80+')"> 

          <!-- Add to $TOTAL value --> 
          <xsl:variable name = "TOTAL" select = "number($TOTAL) + number(value/text())" /> 

          <AgeGroup> 
           <Range> 
            <xsl:value-of select="Range/text()" /> 
           </Range> 
           <value> 
            <xsl:value-of select="value/text()" /> 
           </value> 
          </AgeGroup> 
         </xsl:if> 

         <!-- $AGE_GROUP1 > 18 & < 25, $AGE_GROUP2 > 18 & 25 for age group 18-25 (e.g. $AGE_GROUP1 = 19 & $AGE_GROUP2 = 27 --> 
         <xsl:if test="$AGE_GROUP1 &gt;= number(substring(Range/text(), 1, 2)) and $AGE_GROUP1 &lt;= number(substring(Range/text(), 4, 2)) and $AGE_GROUP2 &gt;= number(substring(Range/text(), 1, 2)) and $AGE_GROUP2 &gt;= number(substring(Range/text(), 4, 2)) and not(Range/text() = 'Total') and not(Range/text() = '80+')"> 

          <!-- Add to $TOTAL value --> 
          <xsl:variable name = "TOTAL" select = "number($TOTAL) + number(value/text())" /> 

          <AgeGroup> 
           <Range> 
            <xsl:value-of select="Range/text()" /> 
           </Range> 
           <value> 
            <xsl:value-of select="value/text()" /> 
           </value> 
          </AgeGroup> 
         </xsl:if> 

        </xsl:for-each> 

        <!-- Total calculation for all values within returned age groups --> 
        <AgeGroup> 
         <Range> 
          <xsl:value-of select="'Total'" /> 
         </Range> 
         <value> 
          <xsl:value-of select="$TOTAL" /> 
         </value> 
        </AgeGroup> 

       </Entry> 
      </xsl:if> 
     </xsl:for-each> 

    </xsl:template> 

</xsl:stylesheet> 

私は今、何を得る私は変数を割り当てることができないとして抽出された年齢層の値の合計値を持っていません以下であり、各接合部で$ TOTAL:

01私は必要なもの
<?xml version="1.0" encoding="UTF-8"?> 
<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Blemish on Card</Reason> 
    <AgeGroup> 
     <Range>16-17</Range> 
     <value>3</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>18-25</Range> 
     <value>12</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>Total</Range> 
     <value>0</value> 
    </AgeGroup> 
</Entry> 
<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Damaged</Reason> 
    <AgeGroup> 
     <Range>16-17</Range> 
     <value>6</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>18-25</Range> 
     <value>0</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>Total</Range> 
     <value>0</value> 
    </AgeGroup> 
</Entry> 

これです:

<?xml version="1.0" encoding="UTF-8"?> 
<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Blemish on Card</Reason> 
    <AgeGroup> 
     <Range>16-17</Range> 
     <value>3</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>18-25</Range> 
     <value>12</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>Total</Range> 
     <value>15</value> 
    </AgeGroup> 
</Entry> 
<Entry> 
    <Year>2005</Year> 
    <Month>DEC</Month> 
    <Reason>Damaged</Reason> 
    <AgeGroup> 
     <Range>16-17</Range> 
     <value>6</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>18-25</Range> 
     <value>0</value> 
    </AgeGroup> 
    <AgeGroup> 
     <Range>Total</Range> 
     <value>6</value> 
    </AgeGroup> 
</Entry> 

私はXSLTを行うために使用しているコマンドはこれです:誰がどのように私ができる任意のアイデアを持っている場合、私はちょうど思ったんだけどjava -jar saxon9he.jar sample1.xml sample1.xslt > out.xml

if条件が入力されるたびにXSLTに表示される値のような値を追加して、その年齢グループの値が合計に加算され、合計が出力XMLファイル内に返されるようにしますか?

答えて

1

あなただけ使用することになり、

<xsl:for-each select="Age/Group 
         [$AGE_GROUP1 &lt;= number(substring(Range/text(), 4, 2))] 
         [$AGE_GROUP2 &gt;= number(substring(Range/text(), 1, 2))]"> 

しかし、合計を得るという点で....私が思うに、というよりも範囲が重複するためにテストするために3つの別々の表現を持って、あなただけの1つの条件にそれを減らすことができますsumはすべてのvalue要素を要約する関数です。あなたが...

<xsl:variable name="groups" select="Age/Group[$AGE_GROUP1 &lt;= number(substring(Range/text(), 4, 2))][$AGE_GROUP2 &gt;= number(substring(Range/text(), 1, 2))]" /> 

を変数に上記の式を置くことができ、次のように続いて、あなたは合計を取得する:あなたへの答えは:

<xsl:value-of select="sum($groups/value)" /> 

は、このXSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

    <xsl:variable name = "QUERY_YEAR1" select = "2005" /> 
    <xsl:variable name = "QUERY_YEAR2" select = "2007" /> 
    <xsl:variable name = "AGE_GROUP1" select = "14" /> 
    <xsl:variable name = "AGE_GROUP2" select = "24" /> 
    <xsl:variable name = "TOTAL" select = "0" /> 

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

    <xsl:template match="/"> 

     <xsl:for-each select="Replacements/Entry"> 
      <xsl:if test="$QUERY_YEAR1 &lt;= Year/text() and $QUERY_YEAR2 &gt;= Year/text()"> 
       <Entry> 
        <Year> 
         <xsl:value-of select="Year/text()" /> 
        </Year> 
        <Month> 
         <xsl:value-of select="Month/text()" /> 
        </Month> 
        <Reason> 
         <xsl:value-of select="Reason/text()" /> 
        </Reason> 
        <xsl:variable name="groups" select="Age/Group[$AGE_GROUP1 &lt;= number(substring(Range/text(), 4, 2))][$AGE_GROUP2 &gt;= number(substring(Range/text(), 1, 2))]" /> 
        <xsl:for-each select="$groups"> 
          <AgeGroup> 
           <Range> 
            <xsl:value-of select="Range/text()" /> 
           </Range> 
           <value> 
            <xsl:value-of select="value/text()" /> 
           </value> 
          </AgeGroup> 
        </xsl:for-each> 
        <!-- Total calculation for all values within returned age groups --> 
        <AgeGroup> 
         <Range> 
          <xsl:value-of select="'Total'" /> 
         </Range> 
         <value> 
          <xsl:value-of select="sum($groups/value)" /> 
         </value> 
        </AgeGroup> 
       </Entry> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

EDITしてみてくださいあなたが "80+"という形式の年齢の範囲を持っていたとしたら、私はあなたのようにgroups変数を微調整できると思います:

<xsl:variable name="groups" select="Age/Group 
        [substring(Range/text(), 3, 1) = '+' or $AGE_GROUP1 &lt;= number(substring(Range/text(), 4, 2))] 
        [$AGE_GROUP2 &gt;= number(substring(Range/text(), 1, 2))]" /> 
+0

ありがとうございました!それが私の必要なものです。私は、元のXMLファイルに 80+ を他の年齢層を得た場合、私は何をしますか? – iteong

+0

私は答えを編集して、これに対処するために式をどのように調整できるかを見せてくれることを願っています。 –

+0

完璧!それは素晴らしい作品です!ラブスタックオーバーフロー= D – iteong

関連する問題