0

次のような入力 XML があります。

<Results>
<School>
    <Name>A</Name>
    <Location>
        <StreetAddress>abc</StreetAddress>
        <Distance>5</Distance>
    </Location>
    <Location>
        <StreetAddress>def</StreetAddress>
        <Distance>3</Distance>
    </Location>
    <Location>
        <StreetAddress>xyz</StreetAddress>
        <Distance>6</Distance>
    </Location>
</School>
<School>
    <Name>B</Name>
    <Location>
        <StreetAddress>abc1</StreetAddress>
        <Distance>7</Distance>
    </Location>
    <Location>
        <StreetAddress>def2</StreetAddress>
        <Distance>6</Distance>
    </Location>
    <Location>
        <StreetAddress>xyz3</StreetAddress>
        <Distance>2</Distance>
    </Location>
</School>
<School>
    <Name>C</Name>
    <Location>
        <StreetAddress>abc4</StreetAddress>
        <Distance>2</Distance>
    </Location>
    <Location>
        <StreetAddress>def5</StreetAddress>
        <Distance>1</Distance>
    </Location>
    <Location>
        <StreetAddress>xyz6</StreetAddress>
        <Distance>0.5</Distance>
    </Location>
</School>   

XSL v1 を使用して、場所ノードを距離で並べ替え、次に学校を最小距離で並べ替える必要があります。基本的に、出力は次のようになります。

<Results>
<School>
    <Name>C</Name>
    <Location>
        <StreetAddress>xyz6</StreetAddress>
        <Distance>0.5</Distance>
    </Location>
    <Location>
        <StreetAddress>def5</StreetAddress>
        <Distance>1</Distance>
    </Location>
    <Location>
        <StreetAddress>abc4</StreetAddress>
        <Distance>2</Distance>
    </Location>
</School>   
<School>
    <Name>B</Name>
    <Location>
        <StreetAddress>xyz3</StreetAddress>
        <Distance>2</Distance>
    </Location>
    <Location>
        <StreetAddress>def2</StreetAddress>
        <Distance>6</Distance>
    </Location>
    <Location>
        <StreetAddress>abc1</StreetAddress>
        <Distance>7</Distance>
    </Location>
</School>
<School>
    <Name>A</Name>
    <Location>
        <StreetAddress>def</StreetAddress>
        <Distance>3</Distance>
    </Location>
    <Location>
        <StreetAddress>abc</StreetAddress>
        <Distance>5</Distance>
    </Location>
    <Location>
        <StreetAddress>xyz</StreetAddress>
        <Distance>6</Distance>
    </Location>
</School>

これを行うには、最初に距離に基づいてノードを並べ替え、それらを変数に格納してから、/Results/School/Location[1]/Distance で再度並べ替えます。

これらすべてを一度に実行する方法があるかどうか疑問に思っています。

あなたの助けに感謝。

4

1 に答える 1

0

XSLT 2.0 を使用すると、簡単に実行できます

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

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

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="Results">
  <xsl:copy>
    <xsl:apply-templates select="School">
      <xsl:sort select="min(Location/Distance/number(.))"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="School">
  <xsl:copy>
    <xsl:apply-templates select="Name"/>
    <xsl:apply-templates select="Location">
      <xsl:sort select="number(Distance)"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

XSLT 1.0 では、変数にソートするアプローチが正しいと思います。

于 2013-06-16T09:53:05.217 に答える