0

データソースとして xmldatasource を取得するリストビューがあります。xmldatasource は動的に作成され、割り当てられます。を使用してデータをリストビューにバインドする直前に xpath を使用する

 listview.datasource = myxmlsource
listview.DataBind()

を使用してノード要素のみが選択されxpath="root/node"ます。したがって、xpath が適用された後の xml 構造は次のようになります。

<node name="Albert" age="32" desc="some random description" region="north"/>
<node name="Randy" age="32" desc="some random description" region="south"/>
<node name="Zebra" age="32" desc="some random description"region="east"/>
<node name="Bob" age="32" desc="some random description"region="south"/>
<node name="Carl" age="32" desc="some random description"region="north"/>
<node name="Denver" age="32" desc="some random description"region="east"/>

ルートがないことに注意してください。この XSLT をソートしようとしています。

ここでの目的は、xml を地域ごとにグループ化し、xml を名前で並べ替えることです。

私は XSLT に慣れていないので、かなり野獣のようです。

これまでのところ、私が思いつく xslt コードは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl my" xmlns:my="http://tempuri.org"
>
  <xsl:output method="xml" indent="yes"/>

    <xsl:template name="@*|node()">

      <xsl:copy>
        <xsl:apply-templates select="@*|node() >
          <xsl:sort select="@region" order="ascending"/>
          <xsl:sort select="@name"/>
        </xsl:apply-templates>
      </xsl:copy>    
    </xsl:template>    

</xsl:stylesheet>

地域でグループ化し、名前で並べ替えた後の期待される出力は次のとおりです。

<node name="Denver" age="32" desc="some random description"region="east"/>
<node name="Zebra" age="32" desc="some random description"region="east"/>
<node name="Albert" age="32" desc="some random description" region="north"/>
<node name="Carl" age="32" desc="some random description"region="north"/>
<node name="Bob" age="32" desc="some random description"region="south"/>
<node name="Randy" age="32" desc="some random description" region="south"/>

アップデート:

言い忘れましたが、地域ごとのグループ化の順序は必ずしも昇順または降順である必要はありませんが、北が最初、東が 2 番目、南が 3 番目などの任意のカスタム条件に基づくことができます。カスタムオーダーを実現する方法は?

私は次のことを試しましたが、同様のものをいくつか試しました。

このドキュメントには既に「DocumentElement」ノードがあります。

<?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
      <xsl:output method="xml" indent="yes"/>

        <xsl:template match="@*|node()">
          <xsl:copy>
            <xsl:apply-templates select="node[@region='north']" >
              <xsl:sort select="@name"/>
            </xsl:apply-templates>
          </xsl:copy>    
           <xsl:copy>
            <xsl:apply-templates select="node[@region='east']" >
              <xsl:sort select="@name"/>
            </xsl:apply-templates>
          </xsl:copy>    
          <xsl:copy>
            <xsl:apply-templates select="node[@region='south']" >
              <xsl:sort select="@name"/>
            </xsl:apply-templates>
          </xsl:copy>  
        </xsl:template>    

    </xsl:stylesheet>
4

1 に答える 1

0

あなたの XSLT はほぼ正しいです - テンプレートには属性ではmatch="..."なく が必要です - これが作業バージョンです:name="..."

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl my" xmlns:my="http://tempuri.org"
>
  <xsl:output method="xml" indent="yes"/>

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

</xsl:stylesheet>
于 2012-10-10T22:43:41.683 に答える