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 回答