1

リストあり

<items>
<item parentid='1'>
<amount>3</amount>
</item>
<item parentid='2'>
<amount>1</amount>
</item>
</items>

およびドキュメント:

<udata id='1'>
<price>10</price>
</udata>
<udata id='1'>
<price>20</price>
</udata>

価格のすべてのドキュメントを合計する方法は? 私が使用したカウントを合計するには:

<xsl:value-of select="sum(items/item/amount)"/>

私は使用します:

<xsl:apply-templates select="udata/items/item" mode='price2' />

    <xsl:template mode='price2' match='item'>
        <xsl:apply-templates select="document(concat('upage://', page/@parentId))" mode='price'>
            <xsl:with-param select='amount' name='count'/>
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template mode='price' match='/'>
        <xsl:param name='count'/>
        <xsl:value-of select="$count * /udata/page/properties/group[@name='price_prop']/property[@name='price']/value"/>
    </xsl:template>

その結果、私は持っていました:

3020

50 が必要です。これを行うにはどうすればよいですか?

4

2 に答える 2

1

以下は、XSLT 2.0 を想定したサンプルです (たとえば、Saxon 9 または AltovaXML で可能な場合):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:param name="data-url" select="'test2012050103.xml'"/>
  <xsl:variable name="data-doc" select="document($data-url)"/>

  <xsl:key name="k1" match="udata" use="@id"/>

  <xsl:template match="items">
    <xsl:value-of select="sum(for $item in item return $item/amount * key('k1', $item/@parentid, $data-doc)/price)"/>
  </xsl:template>

</xsl:stylesheet>

文書例は

<items>
<item parentid='1'>
<amount>3</amount>
</item>
<item parentid='2'>
<amount>1</amount>
</item>
</items>

<root>
<udata id='1'>
<price>10</price>
</udata>
<udata id='2'>
<price>20</price>
</udata>
</root>

出力は50です。

[編集] XSLT 1.0 スタイルシートは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:param name="data-url" select="'test2012050103.xml'"/>
  <xsl:variable name="data-doc" select="document($data-url)"/>

  <xsl:key name="k1" match="udata" use="@id"/>

  <xsl:template match="items">
    <xsl:call-template name="sum">
      <xsl:with-param name="items" select="item"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="sum">
    <xsl:param name="items" select="/.."/>
    <xsl:param name="total" select="0"/>
    <xsl:choose>
      <xsl:when test="not($items)">
        <xsl:value-of select="$total"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:variable name="price">
          <xsl:for-each select="$data-doc">
            <xsl:value-of select="$items[1]/amount * key('k1', $items[1]/@parentid)/price"/>
          </xsl:for-each>
        </xsl:variable>
        <xsl:call-template name="sum">
          <xsl:with-param name="items" select="$items[position() > 1]"/>
          <xsl:with-param name="total" select="$total + $price"/>
        </xsl:call-template>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>


</xsl:stylesheet>
于 2012-05-01T11:19:09.447 に答える
0

より短い解決策は次のとおりです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vPrices" select=
   "document('file:///c:/temp/delete/priceData.xml')/*/*"/>

 <xsl:template match="/*">
  <xsl:apply-templates select="item[1]"/>
 </xsl:template>

 <xsl:template match="item" name="sumProducts">
  <xsl:param name="pAccum" select="0"/>

     <xsl:variable name="vNewAccum" select=
      "$pAccum +amount * $vPrices[@id = current()/@parentid]/price"/>

      <xsl:if test="not(following-sibling::*)">
       <xsl:value-of select="$vNewAccum"/>
      </xsl:if>
      <xsl:apply-templates select="following-sibling::*">
        <xsl:with-param name="pAccum" select="$vNewAccum"/>
      </xsl:apply-templates>
 </xsl:template>
</xsl:stylesheet>

次の XML ドキュメントに適用した場合:

<items>
    <item parentid='1'>
        <amount>3</amount>
    </item>
    <item parentid='2'>
        <amount>1</amount>
    </item>
</items>

ファイルに次のものc:\temp\delete\priceData.xmlが含まれている:

<root>
    <udata id='1'>
        <price>10</price>
    </udata>
    <udata id='2'>
        <price>20</price>
    </udata>
</root>

次に、必要な正しい結果が生成されます。

50
于 2012-05-01T12:24:06.140 に答える