0

XSLT-1.0でxmlの値でソートすることは可能ですか?以下の例では、s<examples>のリストをフィールド<example>でソートするように要求していyearます。

...
<examples>
  <sortby>year</sortby>

  <example>
    <year>2012</year>
    <number>3</number>
  </example>

</examples>
...

この場合、選択を使用した静的条件は機能しません。これは、の可能なフィールドが何であるかがわからない<example>ためです。

4

3 に答える 3

1

はい、次の形式のものを使用してください:

<xsl:apply-templates select="example">
  <xsl:sort select="*[name()=sortby]" data-type="{sort-data-type}" 
            order="{sort-order}" />
</xsl:apply-templates>

並べ替えのデータ型と順序も指定する必要があることに注意してください。

完全な例

<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:copy>
    <xsl:apply-templates select="example">
      <xsl:sort select="*[name()=/*/sortby]" data-type="{/*/sort-data-type}"
                order="{/*/sort-order}" />
    </xsl:apply-templates>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="example">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合:

<examples>
    <sortby>year</sortby>
    <sort-data-type>number</sort-data-type>
    <sort-order>descending</sort-order>
    <example>
        <year>2008</year>
        <number>3</number>
    </example>
    <example>
        <year>2012</year>
        <number>2</number>
    </example>
    <example>
        <year>2010</year>
        <number>5</number>
    </example>
</examples>

必要な正しい結果が生成されます:

<examples>
   <example>
      <year>2012</year>
      <number>2</number>
   </example>
   <example>
      <year>2010</year>
      <number>5</number>
   </example>
   <example>
      <year>2008</year>
      <number>3</number>
   </example>
</examples>

同じ変換がこのXMLドキュメントに適用される場合(上記と同じですが、変更されたsortbysort-order):

<examples>
    <sortby>number</sortby>
    <sort-data-type>number</sort-data-type>
    <sort-order>ascending</sort-order>
    <example>
        <year>2008</year>
        <number>3</number>
    </example>
    <example>
        <year>2012</year>
        <number>2</number>
    </example>
    <example>
        <year>2010</year>
        <number>5</number>
    </example>
</examples>

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

<examples>
   <example>
      <year>2012</year>
      <number>2</number>
   </example>
   <example>
      <year>2008</year>
      <number>3</number>
   </example>
   <example>
      <year>2010</year>
      <number>5</number>
   </example>
</examples>

説明

  1. select属性にxsl:sortは任意のXPath式を含めることができるため、ソートする要素の子を選択する式を指定して、その名前が別のXPath式を評価した結果になるようにすることができます。

  2. selectXSLTでは、通常、 * AVT *(属性値テンプレート)以外のすべての属性を値に指定できます。

于 2012-08-07T12:05:03.583 に答える
0

並べ替え*[local-name() = $your-sort-item]、例

<xsl:template match="examples">
  <xsl:variable name="sort-name" select="sortby"/>
  <xsl:apply-templates select="example">
    <xsl:sort select="*[local-name() = $sort-name]"/>
  </xsl:apply-templates>
</xsl:template>
于 2012-08-07T12:04:07.453 に答える
0

ソートするノードは動的で、examples/sortByノードから読み取られる必要があることを意味していると思います。これが事実です:

<xsl:template match="examples">
    <xsl:apply-templates select='example'>
        <xsl:sort
            select='*[name() = /examples/sortby]'
            data-type='number'
            order='descending' 
        />
    </xsl:apply-templates>
</xsl:template>
<xsl:template match='example'>
    <p><xsl:value-of select='year' /></p>
</xsl:template>

このXMLプレイグラウンドで実行可能なデモ。

それは毎年、それぞれを段落として出力します。必要に応じて、「降順」を「昇順」に変更します。

于 2012-08-07T12:04:31.863 に答える