2

私は XSLT の初心者で、XML を XML に変換するために使用しています。

Prices合計額が最も低いタグを取得する必要があります。

ソース XML:

<Result>
    <Fares>
        <Fare>
            <Prices>
                <Price type="adt" ticket="15"/>
                <Price type="chd" ticket="10"/>
                <Price type="inf" ticket="10"/>
            <Prices>
        </Fare>
        <Fare>
            <Prices>
                <Price type="adt" ticket="10"/>
                <Price type="chd" ticket="10"/>
                <Price type="inf" ticket="10"/>
            <Prices>
        </Fare>
        <Fare>
            <Prices>
                <Price type="adt" ticket="5"/>
                <Price type="chd" ticket="5"/>
                <Price type="inf" ticket="5"/>
            <Prices>
        </Fare>
        <Fare>
            <Prices>
                <Price type="adt" ticket="10"/>
                <Price type="chd" ticket="5"/>
                <Price type="inf" ticket="5"/>
            <Prices>
        </Fare>
    </Fares>
</Result>

XSLT:

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

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="Result">
        <xsl:element name="Lowest">
            <xsl:variable name="lowest" select="Fares/Fare/Prices[not(sum(Price/@ticket) &gt; //Fares/Fare/Prices[sum(Price/@ticket)])]"/>
            <xsl:copy-of select="$lowest"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

出力:

<Lowest>
    <Prices>
        <Price type="adt" ticket="15"/>
        <Price type="chd" ticket="10"/>
        <Price type="inf" ticket="10"/>
    <Prices/>
    </Prices>
</Lowest>

期待される出力:

<Lowest>
    <Prices Total="15">
        <Price type="adt" ticket="5"/>
        <Price type="chd" ticket="5"/>
        <Price type="inf" ticket="5"/>
    <Prices>
</Lowest>

上記のように、出力にはPrices属性として最も低い値を持つタグも含まれている必要があります。

助けてください。

4

3 に答える 3

2

並べ替えて、並べ替え順に最初のものを取得できます。

<xsl:template match="Result">
  <Lowest>
    <xsl:for-each select="Fares/Fare/Prices">
      <xsl:sort select="sum(Price/@ticket)" data-type="number"/>
      <xsl:if test="position() = 1">
         <Prices Total="{sum(Price/@ticket)}">
           <xsl:copy-of select="node()"/>
         </Prices>
      </xsl:if>
    </xsl:for-each>
  </Lowest>
</xsl:template>
于 2012-12-05T12:40:13.237 に答える
2

タグを閉じていません<Prices>

しかし、これでうまくいくはずです:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <Lowest>
      <xsl:for-each select="/Result/Fares/Fare/Prices">
        <xsl:sort select="sum(./Price/@ticket)" data-type="number" order="ascending"/>
        <xsl:if test="position() = 1">
          <Prices>
            <xsl:attribute name="Total">
              <xsl:value-of select="sum(./Price/@ticket)"/>
            </xsl:attribute>
            <xsl:copy-of select="./Price"/>
          </Prices>
        </xsl:if>
      </xsl:for-each>
    </Lowest>
  </xsl:template>
</xsl:stylesheet>
于 2012-12-05T12:49:11.697 に答える
1

この変換

<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:template match="/">
     <xsl:for-each select="/*/*/Fare">
       <xsl:sort select="sum(Prices/Price/@ticket)" data-type="number"/>

       <xsl:if test="position()=1">
         <Lowest Total="{sum(Prices/Price/@ticket)}">
           <xsl:copy-of select="Prices"/>
         </Lowest>
       </xsl:if>
     </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合(いくつかの不正が修正されています!!!):

<Result>
    <Fares>
        <Fare>
            <Prices>
                <Price type="adt" ticket="15"/>
                <Price type="chd" ticket="10"/>
                <Price type="inf" ticket="10"/>
            </Prices>
        </Fare>
        <Fare>
            <Prices>
                <Price type="adt" ticket="10"/>
                <Price type="chd" ticket="10"/>
                <Price type="inf" ticket="10"/>
            </Prices>
        </Fare>
        <Fare>
            <Prices>
                <Price type="adt" ticket="5"/>
                <Price type="chd" ticket="5"/>
                <Price type="inf" ticket="5"/>
            </Prices>
        </Fare>
        <Fare>
            <Prices>
                <Price type="adt" ticket="10"/>
                <Price type="chd" ticket="5"/>
                <Price type="inf" ticket="5"/>
            </Prices>
        </Fare>
    </Fares>
</Result>

必要な正しい結果を生成します

<Lowest Total="15">
   <Prices>
      <Price type="adt" ticket="5"/>
      <Price type="chd" ticket="5"/>
      <Price type="inf" ticket="5"/>
   </Prices>
</Lowest>
于 2012-12-05T13:09:37.320 に答える